Strukturalar
Sinf kabi struktura ham konstruktorlarni aniqlay oladi. Ammo sinfdan farqli o'laroq, struktura ob'ektini yaratish uchun konstruktorni chaqirishga hojat yo'q:
User ali;
Ammo, agar shu tarzda struktura ob'ekti yaratiladigan bo'lsa, unda ularning qiymatlarini olishdan oldin yoki struktura metodlarini chaqirishdan oldin strukturaning barcha maydonlarini (global o'zgaruvchilarini) initsalizatsiya qilish kerak. Ya'ni, masalan, quyidagi holatda xatolik yuz beradi, chunki maydonlarga va metodlarga murojaat ularga boshlang'ich qiymatlarni berishdan oldin sodir bo'ladi:
User ali;
int x = ali.age; // Xatolik
ali.DisplayInfo(); // Xatolik
Parametrlarsiz konstruktor strukturani yaratish uchun ham foydalanishimiz mumkin, u kelishuv bo'yicha strukturada bo'ladi va chaqirilganda strukturaning maydonlariga kelishuv bo’yicha qiymat beriladi (masalan, sonli turlar uchun bu qiymat 0 ga teng):
User ali = new User();
tom.DisplayInfo(); // Name: Age: 0
Kelishuv bo’yicha konstruktordan foydalanishda struktura maydonlarini oshkor ravishda initsializatsiya qilish shart emas.
Shuningdek, biz o'zimizning konstruktorlarimizni aniqlay olamiz. Masalan, User strukturasini o'zgartiraylik:
struct User
{
public string name;
public int age;
public User(string name, int age)
{
this.name = name;
this.age = age;
}
public void DisplayInfo()
{
Console.WriteLine($"Name: {name} Age: {age}");
}
}
Shuni e'tiborga olish kerakki, agar strukturada konstruktor aniqlansa, unda u strukturaning barcha maydonlarini initsializatsiya qilishi kerak, yuqoridagi
misolda name va age o'zgaruvchilarining qiymatlari o'rnatiladi. Xuddi sinflardagi kabi, strukturani yaratish uchun initsializatordan foydalanish mumkin:
User person = new User { name = "Sanjar", age = 31 };
Ammo sinfdan farqli o'laroq, strukturani e'lon qilishda ularni maydonlarini to'g'ridan-to'g'ri initsializatsiya qilib bo’lmaydi, masalan:
struct User
{
public string name = "Sanjar"; // ! Xatolik
public int age = 23; // ! Xatolik
public void DisplayInfo()
{
Console.WriteLine($"Name: {name} Age: {age}");
}
}
Sinflar bilan bir qatorda C# da strukturalar shaxsiy ma'lumotlar turlarini yaratishning yana bir usuli hisoblanadi. Ko'pgina oʻzgaruvchi turlari, masalan, int, double va boshqalar strukturalardir.
Misol uchun, insonni ifodalovchi strukturani koʻramiz:
человека:
struct User
{
public string name;
public int age;
public void DisplayInfo()
{
Console.WriteLine("Ism: {0} Age: {1}", name, age);
}
}
Sinflar singari, strukturalar qiymatni o'zgaruvchilar orqali saqlashi va metodlar orqali amallar bajarishi mumkin. Yuqorida berilgan misolda ikki o'zgaruvchi inson nomini va yoshini saqlash uchun, DisplayInfo metodi esa ularni ekranga chiqarish uchun xizmat qiladi.
Ushbu strukturadan dasturda foydalanamiz:
using System;
namespace HelloApp
{
struct User
{
public string name;
public int age;
public void DisplayInfo()
{
Console.WriteLine("Ism: {0} Age: {1}", name, age);
}
}
class Program
{
static void Main(string[] args)
{
User tom;
tom.name = "Tom";
tom.age = 34;
tom.DisplayInfo();
Console.ReadKey();
}
}
}
Bilamizki, Sinflar ko’rsatkich hisoblanadi. Bu shuni anglatadiki, sinflarning namunalariga faqat ko’rsatkich (havola) orqali kirish mumkin. C# da sinflarga o'xshash berilganlar turi aniqlangan, ammo sinflardan farqli o'laroq, bu o'lchovli turdir. (размерный тип). Ushbu tur strukturadir.
Struktura o'lchovli tur bo'lganligi sababli, struktura namunasi elementlarning qiymatini saqlaydi, ularga havolalar emas va ular stekda joylashgan bo'lad, iuyumda emas. Shu sababli, struktura voris ierarxiyasida ishtirok eta olmaydi, faqat interfeyslarni amalga oshirishi mumkin.
Bundan tashqari, tuzilishga quyidagilar taqiqlanadi:
kelishuv bo'yicha konstruktorni aniqlash, chunki u oshkor aniqlanmagan va uning barcha elementlariga kelishuv bo’yicha qiymatlarni beradi (tegishli turdagi nollar);
destruktorni aniqlash, chunki uning ma'nosi yo'q.
Struktura sintaksisi quyidagicha:
[atributlar] [specifikatorlar] struct struktura_nomi [: interfeyslar]
{
struktura_tanasi
}
Struktura spetsifikatorlari xuddi sinf spetsifikatorlari kabi bir xil ma'noga ega. Biroq, kirish xususiyatlaridan faqat public, internal va shuningdek, ichma-ich joylashgan strukturalar uchun private spetsifikatoridan foydalanishga ruxsat beriladi.
Bundan tashqari, strukturalar abstrakt bo'lishi mumkin emas, chunki ulardan kelishuv bo'yicha voris olib bo’lmaydi.
Struktura tomonidan amalga oshirilgan interfeyslar vergul bilan ajratiladi.
Stuktura tanasi tarkibiga quyidagilar kirishi mumkin: konstantalar, maydonlar, konstruktorlar, metodlar, xossalar, indeksatorlar, operatorli metodlar, ichma-ich turlar va hodisalar.
Strukturani aniqlashda faqat statik maydonlarga qiymat o'rnatish mumkin.
Qolgan maydonlarga kelishuv bo’yicha konstruktor yordamida o'lchamli turdagi maydonlar uchun 0 va ko’rsatkich turidagi maydonlar uchun null beriladi.
this parametric qiymat sifatida talqin etiladi, shuning uchun uni ko’rsatkich uchun ishlatish mumkin, lekin qiymat berish uchun qo’llab bo’lmaydi.
Strukturalar ierarxiyada ishtirok eta olmasligi sababli, uning a'zolari uchun protected va protected internal spetsifikatorlardan foydalanib bo’lmaydi. Struktura metodlari abstrakt va virtual bo'lishi mumkin emas. Va faqat object bazaviy sinfidan voris bo'lib o'tgan metodlargina qayta aniqlanishi mumkin.
Sinflar bilan bir qatorda, strukturalar C # da berilganlar turlarini yaratishning yana bir usulini taqdim etadi. Bundan tashqari, int, double va boshqa turlar kabi ko'plab primitiv turlar aslida struktulardir.
Masalan, shaxsni ifodalovchi strukturani aniqlaylik:
struct User
{
public string name;
public int age;
public void DisplayInfo()
{
Console.WriteLine($"Name: {name} Age: {age}");
}
}
Do'stlaringiz bilan baham: |