13-bo‘lim
Structure, Enum va Module
Qiymat turi sifatida Structure va uning Class dan farqi, Enum bilan nomlangan doimiylar, Flags, hamda Module ning vazifasi.
Ushbu bo‘lim mundarijasi
Sinfdan tashqari yana uchta muhim tuzilma bor. Ularning har biri o'z o'rniga ega.
Structure - qiymat turi #
Public Structure Nuqta
Public Property X As Integer
Public Property Y As Integer
Public Sub New(x As Integer, y As Integer)
Me.X = x
Me.Y = y
End Sub
Public Function Masofa() As Double
Return Math.Sqrt(X * X + Y * Y)
End Function
Public Overrides Function ToString() As String
Return $"({X}, {Y})"
End Function
End Structure
Module Dastur
Sub Main()
Dim n As New Nuqta(3, 4)
Console.WriteLine(n)
Console.WriteLine(n.Masofa())
End Sub
End Module
(3, 4)
5
Ko'rinishi sinfga juda o'xshash. Farq esa - nusxalash xatti-harakati.
Structure va Class - asosiy farq #
Public Structure NuqtaS
Public Property X As Integer
End Structure
Public Class NuqtaC
Public Property X As Integer
End Class
Module Dastur
Sub Main()
Dim s1 As New NuqtaS()
s1.X = 10
Dim s2 As NuqtaS = s1
s2.X = 99
Dim c1 As New NuqtaC()
c1.X = 10
Dim c2 As NuqtaC = c1
c2.X = 99
Console.WriteLine($"Structure: s1.X = {s1.X}, s2.X = {s2.X}")
Console.WriteLine($"Class: c1.X = {c1.X}, c2.X = {c2.X}")
End Sub
End Module
Structure: s1.X = 10, s2.X = 99
Class: c1.X = 99, c2.X = 99
Mana asosiy farq:
Structure- qiymat turi.s2 = s1nusxa yasaydi.Class- havola turi.c2 = c1bir obyektga ikkita nom beradi.
Structure | Class | |
|---|---|---|
| Turi | Qiymat | Havola |
b = a | Nusxa | Bir obyektga ikki nom |
Nothing bo'la oladimi | Yo'q | Ha |
| Vorislik | Yo'q | Ha |
| Qachon ishlatiladi | Kichik, oddiy ma'lumot | Deyarli hamma joyda |
Structure ni faqat aniq sabab bo'lganda ishlating: juda kichik
(taxminan 16 baytgacha), o'zgarmas va son kabi tabiiy "qiymat"
bo'lgan ma'lumot uchun - nuqta, rang, pul birligi kabi.
Katta Structure ni har uzatganda butunlay nusxalanadi va bu
sinfdan sekinroq bo'lib qoladi.
Enum - nomlangan doimiylar #
Public Enum Holat
Yangi
Korilmoqda
Bajarildi
BekorQilindi
End Enum
Module Dastur
Sub Main()
Dim h As Holat = Holat.Korilmoqda
Console.WriteLine(h.ToString())
Console.WriteLine(CInt(h))
Console.WriteLine(h = Holat.Yangi)
Select Case h
Case Holat.Yangi
Console.WriteLine("Hali boshlanmagan")
Case Holat.Korilmoqda
Console.WriteLine("Ish ketmoqda")
Case Else
Console.WriteLine("Tugagan")
End Select
End Sub
End Module
Korilmoqda
1
False
Ish ketmoqda
Sanoq noldan boshlanadi: Yangi = 0, Korilmoqda = 1 va hokazo.
Diqqat qiling: birinchi qatorda h.ToString() yozilgan. Shunchaki
Console.WriteLine(h) deb yozsangiz, ekranda nom emas, raqam
chiqadi:
1
Sababi nozik: Console.WriteLine ning Integer uchun alohida
versiyasi bor, Enum esa o'zining asosiy turiga (Integer) osongina
aylanadi. Kompilyator shu versiyani tanlaydi va ToString umuman
chaqirilmaydi.
Bu C# dan ko'chib kelganlar uchun kutilmagan bo'ladi - u yerda aynan shu kod nomni chiqaradi.
Xulosa: Enum ni ekranga chiqarayotgan bo'lsangiz, har doim
.ToString() yozing. Interpolyatsiya ichida - $"{h}" - esa nom
to'g'ri chiqadi, chunki u yerda ToString chaqiriladi.
If holat = 1 Then degan kodni olti oydan keyin o'qisangiz, 1
nima ekanini eslay olmaysiz.
If holat = Holat.Korilmoqda Then esa o'zini o'zi tushuntiradi.
Bundan tashqari kompilyator noto'g'ri qiymat berishdan saqlaydi va
muharrir variantlarni o'zi taklif qiladi.
Enum ga aniq qiymat berish #
Public Enum HttpKod
OK = 200
TopilmadiXato = 404
ServerXatosi = 500
End Enum
Module Dastur
Sub Main()
Dim k As HttpKod = HttpKod.TopilmadiXato
Console.WriteLine(k.ToString())
Console.WriteLine(CInt(k))
Console.WriteLine([Enum].IsDefined(GetType(HttpKod), 403))
Console.WriteLine([Enum].IsDefined(GetType(HttpKod), 404))
End Sub
End Module
TopilmadiXato
404
False
True
[Enum] - kvadrat qavs ichida yozilgan, chunki Enum VB da kalit
so'z. Kvadrat qavs "bu kalit so'z emas, nom" degani.
Flags - birlashtiriladigan qiymatlar #
<Flags>
Public Enum Ruxsat
Yoq = 0
Oqish = 1
Yozish = 2
Ochirish = 4
End Enum
Module Dastur
Sub Main()
Dim r As Ruxsat = Ruxsat.Oqish Or Ruxsat.Yozish
Console.WriteLine(r.ToString())
Console.WriteLine(CInt(r))
Console.WriteLine(r.HasFlag(Ruxsat.Yozish))
Console.WriteLine(r.HasFlag(Ruxsat.Ochirish))
End Sub
End Module
Oqish, Yozish
3
True
False
Qiymatlar 1, 2, 4, 8, 16... tanlangani bejiz emas: har biri
alohida bit. Shuning uchun ularni Or bilan birlashtirib, bitta
songa joylash mumkin.
Module #
Butun dastur davomida ochiq bo'ladigan yordamchi funksiyalar uchun
Module ishlatiladi:
Module Matematika
Public Const Pi As Double = 3.14159
Public Function AylanaYuzasi(radius As Double) As Double
Return Pi * radius * radius
End Function
Public Function OrtachaQiymat(ParamArray sonlar() As Double) As Double
If sonlar.Length = 0 Then
Return 0
End If
Return sonlar.Sum() / sonlar.Length
End Function
End Module
Module Dastur
Sub Main()
Console.WriteLine(Math.Round(AylanaYuzasi(2), 4))
Console.WriteLine(OrtachaQiymat(10, 20, 30))
Console.WriteLine(Matematika.Pi)
End Sub
End Module
12.5664
20
3.14159
Diqqat: AylanaYuzasi modul nomisiz chaqirildi. Bu Module
ning asosiy xususiyati.
Module | Class | |
|---|---|---|
| Obyekt yasaladimi | Yo'q | Ha |
| A'zolari | Barchasi Shared | Odatda obyektga tegishli |
| Chaqirish | Nomsiz ham bo'ladi | obyekt.Metod() |
| Vorislik | Yo'q | Ha |
Module qulay, lekin unga ko'p narsa yig'ilsa, dastur tartibsiz
bo'lib ketadi - har qanday joydan har qanday funksiyani chaqirish
mumkin bo'ladi.
Yaxshi qoida: Module ga faqat holatga bog'liq bo'lmagan
yordamchi funksiyalar solinadi - matematik hisob, format qilish
kabi. Ma'lumot saqlaydigan narsalar Class ga tegishli.
Uchtasini birga ishlatish #
Public Enum Daraja
Boshlangich
Orta
Yuqori
End Enum
Public Structure Baho
Public Property Ball As Integer
Public Property Daraja As Daraja
Public Sub New(ball As Integer)
Me.Ball = ball
If ball >= 85 Then
Me.Daraja = Daraja.Yuqori
ElseIf ball >= 60 Then
Me.Daraja = Daraja.Orta
Else
Me.Daraja = Daraja.Boshlangich
End If
End Sub
End Structure
Module Yordamchi
Public Function Tavsif(b As Baho) As String
Return $"{b.Ball} ball - {b.Daraja}"
End Function
End Module
Module Dastur
Sub Main()
For Each ball As Integer In New Integer() {45, 72, 91}
Console.WriteLine(Tavsif(New Baho(ball)))
Next
End Sub
End Module
45 ball - Boshlangich
72 ball - Orta
91 ball - Yuqori
RangnomliStructureyarating (R, G, B xossalari bilan).StructurevaClassnusxalash farqini o'z misolingizda ko'rsating.StructuregaNothingberishga urinib, xatoni o'qing.- Hafta kunlari uchun
Enumyozing. - Oy nomlarini
Enumqilib,Select Caseda ishlating. Enumga aniq raqamlar bering vaCIntbilan tekshiring.<Flags>bilan ruxsatlar to'plamini yarating.HasFlagbilan ayrim ruxsat borligini tekshiring.- Matn formatlash funksiyalarini
Modulega yig'ing. - Modul funksiyasini modul nomi bilan va nomisiz chaqirib ko'ring.
Xulosa #
Structure- qiymat turi:b = ahaqiqiy nusxa yasaydi.Class- havola turi:b = abitta obyektga ikkita nom beradi.- Shubhalansangiz
Classtanlang;Structurefaqat kichik va o'zgarmas ma'lumot uchun. Enumraqamlarga nom beradi va kodni o'zini o'zi tushuntiradigan qiladi.Enumsanog'i noldan boshlanadi; aniq qiymat berish mumkin.<Flags>bilan qiymatlarniOrorqali birlashtirish mumkin - qiymatlar1, 2, 4, 8bo'lishi shart.Enumnomini ko'rish uchun.ToString()yozing:WriteLine(h)raqam chiqaradi,$"{h}"esa nom.Modulea'zolari doimSharedva nomsiz chaqiriladi; unga faqat yordamchi funksiyalar solinadi.
Keyingi bo'limda xatoliklarni boshqarishni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.