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.

🕑 11 daqiqa o‘qish 📄 679 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Structure - qiymat turi
  2. Structure va Class - asosiy farq
  3. Enum - nomlangan doimiylar
  4. Enum ga aniq qiymat berish
  5. Flags - birlashtiriladigan qiymatlar
  6. Module
  7. Uchtasini birga ishlatish
  8. Xulosa

Sinfdan tashqari yana uchta muhim tuzilma bor. Ularning har biri o'z o'rniga ega.

Structure - qiymat turi #

VB
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
Natija
(3, 4)
5

Ko'rinishi sinfga juda o'xshash. Farq esa - nusxalash xatti-harakati.

Structure va Class - asosiy farq #

VB
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
Natija
Structure: s1.X = 10, s2.X = 99
Class:     c1.X = 99, c2.X = 99

Mana asosiy farq:

  • Structure - qiymat turi. s2 = s1 nusxa yasaydi.
  • Class - havola turi. c2 = c1 bir obyektga ikkita nom beradi.
Xotirada nima sodir bo'ladi Structure (qiymat turi) s1 X = 10 s2 X = 99 Ikkita alohida quti - biri o'zgarsa, ikkinchisi tegilmaydi Class (havola turi) c1 c2 obyekt X = 99 Ikkita nom - bitta quti Shuning uchun Structure kichik va o'zgarmas ma'lumot uchun, Class esa haqiqiy obyektlar uchun ishlatiladi.
Bir xil ko'rinadigan kod - butunlay boshqa natija
StructureClass
TuriQiymatHavola
b = aNusxaBir obyektga ikki nom
Nothing bo'la oladimiYo'qHa
VorislikYo'qHa
Qachon ishlatiladiKichik, oddiy ma'lumotDeyarli hamma joyda
Shubhalansangiz Class tanlang

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 #

VB
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
Natija
Korilmoqda
1
False
Ish ketmoqda

Sanoq noldan boshlanadi: Yangi = 0, Korilmoqda = 1 va hokazo.

Enum nomini chiqarish uchun ToString() yozing

Diqqat qiling: birinchi qatorda h.ToString() yozilgan. Shunchaki Console.WriteLine(h) deb yozsangiz, ekranda nom emas, raqam chiqadi:

Natija
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.

Nega Enum, oddiy son emas

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 #

VB
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
Natija
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 #

VB
<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
Natija
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:

VB
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
Natija
12.5664
20
3.14159

Diqqat: AylanaYuzasi modul nomisiz chaqirildi. Bu Module ning asosiy xususiyati.

ModuleClass
Obyekt yasaladimiYo'qHa
A'zolariBarchasi SharedOdatda obyektga tegishli
ChaqirishNomsiz ham bo'ladiobyekt.Metod()
VorislikYo'qHa
Modulga hamma narsani tiqmang

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 #

VB
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
Natija
45 ball - Boshlangich
72 ball - Orta
91 ball - Yuqori
Amaliy topshiriq
  1. Rang nomli Structure yarating (R, G, B xossalari bilan).
  2. Structure va Class nusxalash farqini o'z misolingizda ko'rsating.
  3. Structure ga Nothing berishga urinib, xatoni o'qing.
  4. Hafta kunlari uchun Enum yozing.
  5. Oy nomlarini Enum qilib, Select Case da ishlating.
  6. Enum ga aniq raqamlar bering va CInt bilan tekshiring.
  7. <Flags> bilan ruxsatlar to'plamini yarating.
  8. HasFlag bilan ayrim ruxsat borligini tekshiring.
  9. Matn formatlash funksiyalarini Module ga yig'ing.
  10. Modul funksiyasini modul nomi bilan va nomisiz chaqirib ko'ring.

Xulosa #

  • Structure - qiymat turi: b = a haqiqiy nusxa yasaydi.
  • Class - havola turi: b = a bitta obyektga ikkita nom beradi.
  • Shubhalansangiz Class tanlang; Structure faqat kichik va o'zgarmas ma'lumot uchun.
  • Enum raqamlarga nom beradi va kodni o'zini o'zi tushuntiradigan qiladi.
  • Enum sanog'i noldan boshlanadi; aniq qiymat berish mumkin.
  • <Flags> bilan qiymatlarni Or orqali birlashtirish mumkin - qiymatlar 1, 2, 4, 8 bo'lishi shart.
  • Enum nomini ko'rish uchun .ToString() yozing: WriteLine(h) raqam chiqaradi, $"{h}" esa nom.
  • Module a'zolari doim Shared va nomsiz chaqiriladi; unga faqat yordamchi funksiyalar solinadi.

Keyingi bo'limda xatoliklarni boshqarishni o'rganamiz.

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.