Umumlashmalarga umumiy tushunchasi
Net platformasining birinchi versiyasi paydo bo'lgandan so'ng, dasturchilar ko'pincha ilovalaridagi ma'lumotlarni boshqarishning yanada moslashuvchan usulini yaratish uchun tizim nomlari maydoni System.Collections dan foydalanganlar. Biroq, .NET 2.0 versiyasidan boshlab, C # dasturlash tili umumlashma (generic) deb ataladigan vositani qo'llab-quvvatlash bilan kengaytirildi. U bilan birga asosiy sinf kutubxonalari kollektsiyalar-tizim bilan bog'liq butunlay yangi nom maydoni System.Collections.Generic. bilan to'ldirildi.
Umumlashma atamasi asosan parametrlangan turni bildiradi. Parametrlangan turlarning alohida roli shundaki, ular qayta ishlangan ma'lumotlar parametr sifatida ko'rsatilgan sinflar, tuzilmalar, interfeyslar, metodlar va delegatlarni yaratishga imkon beradi. Masalan, umumlashtirishlar yordamida turli xil tipdagi ma'lumotlarni qayta ishlash uchun avtomatik ravishda mos keladigan yagona sinf yaratishingiz mumkin. Parametrlangan ma'lumotlar turi bilan ishlaydigan sinf, tuzilma, interfeys, metod yoki delegat umumlashtirilgan sinf yoki umumlashtirilgan metod kabi ataladi.
Shuni alohida ta'kidlash kerakki, C# da har doim umumlashtirilgan kodni yaratish, object kabi havolalar bilan ishlash imkoniyatini beradi. Va object sinfi boshqa barcha sinflar uchun asos bo'lganligi sababli, ob'ekt turiga havola orqali har qanday turdagi ob'ektga murojaat qilishingiz mumkin. Shunday qilib, umumlashma paydo bo'lishidan oldin, dasturlarda turli xil ob'ektlarni ishlatish uchun object tipiga havolalar bilan berilgsn umumlashtirilgan kod xizmat qildi.
Biroq, bunday kodda odatiy xavfsizlikni kuzatish qiyin bo'lgan, chunki ob'ekt turini muayyan turdagi ma'lumotlarga aylantirish uchun turlarni kiritish kerak edi. Va bu xatolarning potentsial manbai bo'lib xizmat qildi, chunki bu turlarni tasodifan noto'g'ri bajarilishi mumkin edi. Bu qiyinchilik ilgari bunday kamchiliklarga ega bo'lgan odatiy xavfsizlikni ta'minlaydigan umumlashmalarni yengib o'tishga imkon beradi. Bundan tashqari, umumlashmalar butun jarayonni soddalashtiradi, chunki ular ob'ektni yoki boshqa turdagi ma'lumotlarni qayta ishlash uchun turlarni olib kelish zarurligini istisno qiladi. Shunday qilib, umumlashmalar kodni qayta ishlatish imkoniyatlarini kengaytiradi va uni ishonchli va sodda bajarishga imkon beradi.
Umumlashma - butunlay yangi dizayn emas; bunday tushunchalar boshqa dastulash tillarida ham mavjud. Misol uchun, o'xshash xususiyatlari C++ andozalarida ham bor. Biroq, C++ andozalari va .Net umumlashma o'rtasida katta farq bor. C++ da, ma'lum bir turdagi shablon namunasi(экземпляр)ni yaratishda shablonlarning manba kodi talab qilinadi. C ++ shablonlaridan farqli o'laroq, umumlashma faqat C # tilining dizayni emas, balki CLR uchun ham belgilanadi. Bu umumiy sinf C#da aniqlangan bo'lsa ham, Visual Basic tilida ma'lum bir turdagi parametr bilan shablon misollarini yaratishga imkon beradi.
Keling, umumlashtirishdan foydalanishning asosiy afzalliklarini ko'rib chiqaylik:
Ishlash
Umumlashmalarning asosiy afzalliklaridan biri ishlab chiqarilishi(Производительность)dir. Noma'lum to'plamlar sinflari bilan qiymat turlarini ishlatish mos yozuvlar turiga va orqaga aylantirilganda paketni (boxing) va ochish (unboxing) ga olib keladi.
Qiymat turlari tizilma(стек)da saqlanadi va ulanish turlari qoziq(куча)da saqlanadi. C # sinflari havolai tiplar, strukturalar esa -qiymat turlaridir. .NET, qiymat turlarini havolali turiga aylantirishni osonlashtiradi, shuning uchun ular ob'ektlar kutilgan (masalan, havolali turlar zarur) joyda ishlatilishi mumkin. Misol uchun, ob'ekt qiymati turini int berilishi mumkin.
Qiymat turini havolali turiga aylantirish (boxing) deb ataladi. Qadoqlash havolali turi parametrini kutganda avtomatik ravishda amalga oshiriladi va u qiymat turiga o'tkaziladi. Boshqa tomondan, qadoqlangan qiymat turi ochish (unboxing) yordamida oddiy qiymat turiga aylantirilishi mumkin.
Xavfsizlik
Umumlashmalarning yana bir xususiyati-turlarning xavfsizligi. Umumlashmalar avtomatik ravishda barcha operatsiyalarning standart xavfsizligini ta'minlaydi. Ushbu operatsiyalarni amalga oshirish jarayonida umumlashmalar turlarni olib kelish va koddagi turlarning qo'lda(ручной) muvofiqligini tekshirish zarurligini ta’kidlaydi.
Ikkilik kodni qayta ishlatish
Umumlashmalar ikkilik kodni qayta ishlatish darajasini oshiradi. Umumlashtirilgan sinf bir marta aniqlanishi mumkin va uning asosida ko'plab turdagi namuna(экземпляр)lar yaratilishi mumkin. Bu dastur matniga C++ shablonlari kabi kabi ruxsat berilisini talab etmaydi.
Kodning "shishishi"
Umumlashtirishdan muayyan turdagi namunalarni yaratishda qancha kod yaratiladi? Umumlashtirilgan sinfning ta'rifi yig'ilishga kiritilganligi sababli, uning asosida o'ziga xos turdagi maxsus sinflarni yaratish kodning takrorlanishiga olib kelmaydi.
Biroq, umumlashtirilgan sinflar JIT kompilyatori tomonidan mahalliy mashina kodida tuzilganda, har bir alohida qiymat turi uchun yangi sinf yaratiladi. Bir vaqtning o'zida havolali turlar bir mahalliy sinfning umumiy amalga oshirilishiga bo'linadi. Buning sababi shundaki, havolali turlarda har bir element xotirada 4 bayt joy(32 bit tizimlarida) va umumlashtirilgan sinfning turli xil havolali turlari bilan amalga oshirilishi-parametrlar bir-biridan farq qilmaydi. Bundan farqli o'laroq, qiymatlarning turlari butun xotirada saqlanadi va ularning har biri turli xil xotira hajmini talab qilganligi sababli, ularning har biri uchun umumlashtirilgan nusxa (экземпляр) lar asosida o'z sinflari yaratiladi.
Nomlash uchun tavsiyalar
Agar dastur umumlashtirishdan foydalansa, unda umumlashtirilgan turlarning o'zgaruvchilarini umulashtirilmaganlaridan osongina ajralib olish mumkin. Quyida umumlashtirilgan turlarni nomlash bo'yicha tavsiyalar keltirilgan:
Umumlashtirilgan turlarning nomlari T harfi bilan boshlanishi kerak.
Agar umumlashtirilgan turni har qanday sinf bilan almashtirish mumkin bo'lsa, chunki maxsus talablar mavjud emas va faqat bitta umumlashtirilgan tur ishlatiladi, ya’ni T umumlashtirilgan tur uchun juda mos nomdir:
public class List { }
public class LinkedList { }
Agar umumiy turdagi maxsus talablar (masalan, interfeysni amalga oshirish yoki ma'lum bir sinfdan meros qilish) yoki ikki yo undan ortiq umumlashtirilgan turdagi parametrlar sifatida ishlatilsa, unda mazmunli nomlar qo'llanilishi kerak:
public delegate void EventHandler(object sender, TEventArgs e) ;
public delegate TOutput Converter(TInput from);
public class SortedList { }
Quyida umumlashtirilgan sinfni e'lon qilishning umumiy shakli keltirilgan:
class sinf_nomi { // ...
Va bu erda umumlashtirilgan sinfga havola qilingan sintaksisi qanday ko'rinadi:
Sinf_nomi< turlarning_argumetrlar_royxati > ozgaruvchi_nomi =
new Sinf_nomi< turlarning_parametrlar_royxati > (konstruktor_argumentlari_ro’yxati);
Keling, bir nechta umumlashtirilgan sinflardan foydalanish misolini ko'rib chiqaylik:
using System;
namespace umumlashmalar
{
class MyObj
{
T obj;
public MyObj(T obj)
{
this.obj = obj;
}
public void objectType()
{
Console.WriteLine("Obyekt turi: " + typeof(T));
}
}
// bir necha parametrli Umlashtirilgan sinf
class MyObjects
{
T obj1;
V obj2;
E obj3;
public MyObjects(T obj1, V obj2, E obj3)
{
this.obj1 = obj1;
this.obj2 = obj2;
this.obj3 = obj3;
}
public void objectsType()
{
Console.WriteLine("\n1-Obyekt turi: " + typeof(T) +
"\n2-Obyekt turi: " + typeof(V) +
"\n3-Obyekt turi: " + typeof(E));
}
}
class Program
{
static void Main()
{
// Umumlashtirilgan sinfdan int turiga mansub ekzemplyar yaratamiz
MyObj obj1 = new MyObj(25);
obj1.objectType();
MyObjects obj2 = new MyObjects("Akmal", 26, 12.333m);
obj2.objectsType();
Console.ReadLine();
}
}
}
MyObj Sinf ushun argument turi ko'rsatilgan bo'lsa, masalan, int yoki string, C# da yopiq konstruktsiyalangan tur yaratiladi. Xususan, MyObj < int> yopiq konstruktsiyalangan turdir. Axir, aslida, MyObj kabi umumlashtirilgan tur abstraktsiya(mavhum) sanaladi. Va faqat ma'lum bir variant yaratilgandan so'ng, masalan, MyObj, ma'lum bir tur yaratiladi. Va Myobj ga o'xshash dizayn C# da ochiqdan-ochiq mo'ljallangan turdagi deb ataladi, chunki u T tipidagi parametrni ko'rsatadi, ammo int kabi aniq tur emas.
C# da ochiq va yopiq turlar kabi tushunchalar tez-tez aniqlanadi. Ochiq turdagi bunday parametr turi yoki har qanday umumlashtirilgan turi, o’sha turdagi argument tur parametri yoki uni o'z ichiga oladi. Ochiq bo'lmagan har qanday turlar yopiq hisoblanadi. Konstruktsiyalangan turdagi tiplar umumlashtirilgan tur hisoblanadi, qaysiki buning uchun barcha turdagi argumentlar taqdim etiladigan. Agar bu argumentlar yopiq turlarga tegishli bo'lsa, unda bu tur yopiq deb hisoblanadi. Va agar bir yoki bir nechta argumentlar ochiq turlarga tegishli bo'lsa, unda bu turdagi ochiq qurilgan hisoblanadi.
Va yana bir narsa. Yuqorida aytib o'tilganidek, quyidagi oqilona savol tug'iladi: agar umumlashtirilgan MyObj sinfining o'xshash funktsiyalari umumlashtirilmasdan olinishi mumkin bo'lsa, ob'ektni faqat ma'lumot turi sifatida ko'rsatib, turlarni to'g'ri olib kelishi mumkin bo'lsa, unda MyObj klassi umumlashtirilgan bo’ladimi? Bu savolga javob, umumlashma avtomatik ravishda MyObj sinfiga ta'sir qiladigan barcha operatsiyalarning standart xavfsizligini ta'minlaydi. Ushbu operatsiyalarni amalga oshirish jarayonida umumlashmalar turlarni olib kelish va koddagi turlarning qo'lda(ручной) muvofiqligini tekshirish zarurligini keltiriladi.
Do'stlaringiz bilan baham: |