Nullable int değer atamak için farklı yöntemler kullanarak bu konuda biraz araştırma yaptım. İşte çeşitli şeyler yaptığımda olan şey. Neler olduğunu netleştirmeli. Unutmayın: Nullable<something>ya da steno something?, derleyicinin sanki bir sınıfmış gibi kullanmamıza izin vermek için çok çalıştığı bir yapıdır.
Aşağıda göreceğiniz gibi SomeNullable == nullve SomeNullable.HasValueher zaman doğru veya yanlış beklenen dönecektir. Aşağıda gösterilmemesine rağmen SomeNullable == 3, geçerlidir (SomeNullable'ın bir olduğu varsayılırsa int?).
İken SomeNullable.Valuebize bir çalışma zamanı hatası alır biz atanmış ise nullhiç SomeNullable. Bu, aşırı yüklenmiş operatörlerin, aşırı yüklenmiş bir kombinasyon sayesinde nullablerin bize bir soruna neden olabileceği tek durumdurobject.Equals(obj) yöntemi ve derleyici optimizasyonu ve maymun işi.
İşte çalıştırdığım bazı kodların ve etiketlerde hangi çıktıların üretildiğinin açıklaması:
int? val = null;
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
Tamam, bir sonraki başlatma yöntemini deneyelim:
int? val = new int?();
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
Hepsi eskisi gibi. İle başlatılıyor unutmayın int? val = new int?(null);null nesnenin DEĞER null değil çünkü yapıcısı geçirilen null, bir DERLEME zaman hata oluşturdu olurdu. Null değerine eşit olan yalnızca sarıcı nesnenin kendisidir.
Aynı şekilde, derleme zamanı hatası alırız:
int? val = new int?();
val.Value = null;
val.Valuezaten salt okunur bir özellik olduğundan bahsetmiyorum, yani şöyle bir şey bile kullanamayız:
val.Value = 3;
ancak yine, polimorföz aşırı yüklenmiş örtük dönüşüm operatörleri şunları yapmamıza izin verir:
val = 3;
Doğru çalıştığı sürece polisomthing whatchamacallits hakkında endişelenmenize gerek yok mu? :)