Boş Değer Atanabilen Değer Türleri (Visual Basic)

Bazen belirli durumlarda tanımlı değeri olmayan bir değer türüyle çalışırsınız. Örneğin, veritabanındaki bir alanın anlamlı ve atanmış bir değere sahip olmayan atanmış bir değere sahip olmayı ayırt etmek zorunda kalabilir. Değer türleri, normal değerlerini veya null değerlerini alacak şekilde genişletilebilir. Böyle bir uzantı null atanabilir tür olarak adlandırılır.

Her null atanabilir değer türü genel Nullable<T> yapıdan oluşturulur. İşle ilgili etkinlikleri izleyen bir veritabanı düşünün. Aşağıdaki örnek null atanabilir Boolean bir tür oluşturur ve bu türdeki bir değişkeni bildirir. Bildirimi üç şekilde yazabilirsiniz:

Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

değişkeniridesBusToWork, Falsedeğerini Truetutabilir veya hiç değer tutamaz. İlk varsayılan değeri hiç değer değildir, bu durumda bu kişi için bilgilerin henüz alınamadığı anlamına gelebilir. Buna karşılık, False bilgilerin edinildiği ve kişinin işe gitmek için otobüse binmediği anlamına gelebilir.

Null atanabilir değer türlerine sahip değişkenleri ve özellikleri bildirebilir ve null atanabilir değer türü öğelerine sahip bir dizi bildirebilirsiniz. Null atanabilir değer türlerine sahip yordamları parametre olarak bildirebilir ve bir Function yordamdan null atanabilir bir değer türü döndürebilirsiniz.

Dizi, String, veya sınıfı gibi bir başvuru türü üzerinde null atanabilir bir tür oluşturamazsınız. Temel alınan tür bir değer türü olmalıdır. Daha fazla bilgi için bkz . Değer Türleri ve Başvuru Türleri.

Null Atanabilir Tür Değişkeni Kullanma

Null atanabilir değer türünün en önemli üyeleri ve Value özellikleridirHasValue. Null atanabilir değer türündeki bir değişken için, HasValue değişkenin tanımlı bir değer içerip içermediğini bildirir. ise HasValueTrue, değerinden değerini Valueokuyabilirsiniz. hem Value hem de HasValue özelliklerinin özellik olduğunu ReadOnly unutmayın.

Varsayılan Değerler

Null atanabilir değer türüne sahip bir değişken bildirdiğinizde, HasValue özelliğinin varsayılan değeri vardır False. Bu, varsayılan olarak değişkenin temel değer türünün varsayılan değeri yerine tanımlı bir değere sahip olmadığı anlamına gelir. Aşağıdaki örnekte, türün varsayılan değeri 0 olmasına rağmen değişkenin numberOfChildrenInteger başlangıçta tanımlı değeri yoktur.

Dim numberOfChildren? As Integer

Null değer, tanımlanmamış veya bilinmeyen bir değeri göstermek için yararlıdır. olarak Integerbildirilmiş olsaydınumberOfChildren, bilgilerin şu anda kullanılabilir olmadığını gösterebilecek bir değer olmazdı.

Değerleri Depolama

Bir değeri, null atanabilir bir değer türünün değişkeninde veya özelliğinde tipik bir şekilde depolarsınız. Aşağıdaki örnek, önceki örnekte bildirilen değişkene numberOfChildren bir değer atar.

numberOfChildren = 2

Boş değer atanabilir değer türünün bir değişkeni veya özelliği tanımlı bir değer içeriyorsa, değerin atanmaması durumunda ilk durumuna geri dönmesine neden olabilirsiniz. Bunu, aşağıdaki örnekte gösterildiği gibi değişkeni veya özelliği olarak Nothingayarlayarak yaparsınız.

numberOfChildren = Nothing

Not

Null atanabilir bir değer türündeki bir değişkene atayabilmenize Nothing rağmen, eşittir işaretini kullanarak değişkeni için Nothing test edemezsiniz. eşittir işaretini kullanan karşılaştırma, someVar = Nothingher zaman olarak Nothingdeğerlendirilir. değişkeninin HasValue özelliğini için Falsetest edebilir veya veya IsNot işlecini Is kullanarak test edebilirsiniz.

Değerler Alınıyor

Null atanabilir değer türündeki bir değişkenin değerini almak için önce değerinin olduğunu onaylamak için özelliğini test HasValue etmelisiniz. olduğunda HasValueFalsedeğeri okumaya çalışırsanız, Visual Basic bir InvalidOperationException özel durum oluşturur. Aşağıdaki örnekte, önceki örneklerin değişkenini numberOfChildren okumanın önerilen yolu gösterilmektedir.

If numberOfChildren.HasValue Then
    MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
    MsgBox("It is not known how many children there are.")
End If

Null Atanabilir Türleri Karşılaştırma

Boole ifadelerinde null atanabilir Boolean değişkenler kullanıldığında, sonuç , Falseveya NothingolabilirTrue. ve için AndOrdoğruluk tablosu aşağıdadır. b1 Ve b2 şimdi üç olası değere sahip olduğundan, değerlendirilecek dokuz birleşim vardır.

b1 B2 b1 Ve b2 b1 Veya b2
Nothing Nothing Nothing Nothing
Nothing True Nothing True
Nothing False False Nothing
True Nothing Nothing True
True True True True
True False False True
False Nothing False Nothing
False True False True
False False False False

Boole değişkeninin veya ifadesinin değeri olduğunda Nothing, ne de truefalseolur. Aşağıdaki örneği inceleyin.

Dim b1? As Boolean
Dim b2? As Boolean
b1 = True
b2 = Nothing

' The following If statement displays "Expression is not true".
If (b1 And b2) Then
    Console.WriteLine("Expression is true")
Else
    Console.WriteLine("Expression is not true")
End If

' The following If statement displays "Expression is not false".
If Not (b1 And b2) Then
    Console.WriteLine("Expression is false")
Else
    Console.WriteLine("Expression is not false")
End If

Bu örnekte, b1 And b2 olarak değerlendirilir Nothing. Sonuç olarak yan Else tümcesi her If deyimde yürütülür ve çıktı aşağıdaki gibidir:

Expression is not true

Expression is not false

Not

AndAlso ve OrElsekısa devre değerlendirmesi kullanan, ilki olarak değerlendirildiğinde ikinci işlenenlerini değerlendirmelidir Nothing.

Yayma

Aritmetik, karşılaştırma, kaydırma veya tür işleminin işlenenlerinden biri veya her ikisi de null atanabilir bir değer türüyse, işlemin sonucu da null atanabilir bir değer türüdür. her iki işlenenin de olmayan değerleri Nothingvarsa, işlem işlenenlerin temel değerleri üzerinde null atanabilir bir değer türü değil gibi gerçekleştirilir. Aşağıdaki örnekte, ve değişkenleri compare1sum1 örtük olarak yazıldı. Fare işaretçisini bunların üzerinde bekletirseniz, derleyicinin her ikisi için de null atanabilir değer türleri çıkardığını görürsünüz.

' Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2

' The comparison evaluated is 3 > 2, but compare1 is inferred to be of 
' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True
Console.WriteLine($"{m} * {n} * {sum1} * {compare1}")

bir veya her iki işlenenin değeri Nothingvarsa, sonuç olur Nothing.

' Change the value of n to Nothing.
n = Nothing

Dim compare2 = m > n
Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays: 3 * <null> * <null> * <null>
Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} * {If(compare2, "<null>")}")

Verilerle Null Atanabilir Türler Kullanma

Veritabanı, null atanabilir değer türlerinin kullanıldığı en önemli yerlerden biridir. Şu anda tüm veritabanı nesneleri null değer türlerini desteklemez, ancak tasarımcı tarafından oluşturulan tablo bağdaştırıcıları destekler. Bkz. Null atanabilir türler için TableAdapter desteği.

Ayrıca bkz.