.NET'te iki tür kategori vardır: başvurular ve değerler (int, double, structs, enums vb.). Farklılıkları arasında bir referansın olabileceği gerçeği, null
bir değer olamaz. Bu nedenle, bir değer türünüz varsa ve "isteğe bağlı" veya "bilinmeyen" anlambilimi iletmek istiyorsanız, bunu süsleyebilirsiniz Nullable<>
. Nullable<>
Yalnızca değer türlerini kabul etmek için türe göre sınırlandırıldığını unutmayın (bir where T : struct
yan tümcesi vardır). Nullable<>
ayrıca derleyiciden özel bir null
değere sahiptir, burada bir değer şunlardan korunur NullReferenceExceptions
:
string x = null;
x.ToString(); // throws a NullReferenceException
int? y = null;
y.ToString(); // returns ""
(Vb Scala, F #, Haskell, Swift gibi) fonksiyonel dillerde o yaygındır null
için mevcut değil . Çünkü tüm insanlar varlığını kötü bir fikirnull
olarak görüyorlar ve dil tasarımcıları bu sorunu çözerek çözüme kavuşturmaya karar verdiler.
Bu, yine bu dillerde değeri olmayan bir değeri temsil etmenin bir yoluna ihtiyacımız olduğu anlamına gelir . Option
Türü girin (adlandırma değişir, Maybe
Haskell'de denir ). Bu Nullable
, değerin "Yok" veya "Bilinmeyen" vb. Olduğu durumu eklemek için bir tür sarmasıyla benzer bir iş yapar .
Gerçek fark, uyguladığınız diller tarafından size verilen ekstra fonksiyonlardadır Option
. Örnek olarak, al Option.map
(sözde kodda):
function Option<T2> Option.map(opt: Option<T1>, mapFunc: T1 -> T2) {
if (opt is None) return None
else return Option<T2>(mapFunc(opt.Value))
}
G gibi zincirleme fonksiyonları Option.map
, C # 'da her yerde gördüğünüz tipik null kontrol kazan plakasından kaçınmanın güçlü bir yoludur:
if (service == null)
return null;
var x = service.GetValue();
if (x == null || x.Property == null)
return null;
return x.Property.Value;
C # içindeki Null olabilecek eşdeğeri şöyle olur:
public static Nullable<T2> Map<T1, T2>(this Nullable<T1> nullable, Func<T1, T2> f)
where T1 : struct
where T2 : struct
{
if (!nullable.HasValue) return (T2?)null;
else return (T2?) f(nullable.Value);
}
Ancak bu, yalnızca değer türleri için çalışacağı için C # 'da sınırlı bir yardımcı program içerir.
C # 'ın yeni sürümü , yalnızca yöntemler ve özellik erişimcileri için geçerli olması dışında ?.
, Option.map
işleve benzeyen "null çoğaltma" operatörünü ( ) sunar . Yukarıdaki örnek yeniden yazılır
return service?.GetValue()?.Property?.Value;