.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, nullbir 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 : structyan tümcesi vardır). Nullable<>ayrıca derleyiciden özel bir nulldeğ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 nulliç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 . OptionTürü girin (adlandırma değişir, MaybeHaskell'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.mapişleve benzeyen "null çoğaltma" operatörünü ( ) sunar . Yukarıdaki örnek yeniden yazılır
return service?.GetValue()?.Property?.Value;