16 Ocak 2020 Perşembe

Nullable Yapısı

Giriş
Nullable Yapısı ve Nullable Sınıfı farklı şeyler. Bu yapı derleyici tarafından şu tür kodlar için üretilir.
int? i = null;
İskelet
Nullable Yapısı iskelet olarak şöyle
struct Nullable<T>
{
  private bool hasValue;
  internal T value;
  /* methods and properties I won't go into here */
}
Constructor
İmzası şöyle.
public static implicit operator Nullable<T> (
    T value
)
Örnek
Şöyle yaparız.
DateTime? d = DateTime.Now;
Örnek
Şöyle yaparız.
int? i = null;
Örnek
Şöyle yaparız.
new T?(x)
GetHashCode Metodu
Metodun içi şöyle.
public override int GetHashCode() {
  return hasValue ? value.GetHashCode() : 0;
}
Açıklaması şöyle.
The hash code of the object returned by the Value property if the HasValue property is true, or zero if the HasValue property is false.
Örnek
Şöyle yaparız.
int? i = null;
i.GetHashCode().Dump();
Çıktı olarak şunu alırız.
0
GetType metodu
Şöyle yaparız.
int? x = null;
Console.Write ("Hashcode: ");
Console.WriteLine(x.GetHashCode());
Console.Write("Type: ");
Console.WriteLine(x.GetType());
HasValue Alanı
Açıklaması şöyle.
An instance for which HasValue is false is said to be null. A null instance has an undefined value. Attempting to read the Value of a null instance causes a System.InvalidOperationException to be thrown. The process of accessing the Value property of a nullable instance is referred to as unwrapping. 
Şöyle yaparız.
DateTime? d = null;
bool boolNotSet = d.HasValue;
Diğer
Wrapping ve UnWrapping
Örnek
Wrapping değer atanması, unwrapping ise okunmasıdır. Şöyle yaparız.
int x = 5;
int? y = x; // Wrapping
int z = (int) y; // Unwrapping
Nullable ve Array
Örnek
Açıklaması şöyle.
params Delegate?[] delegates - It is an array of nullable Delegate

params Delegate?[]? delegates - The entire array can be nullable
Elimizde şöyle bir kod olsun. Burada dizi nullable. Dizinin elemanları da Delegate?
public static Delegate? Combine(params Delegate?[]? delegates)
{
  if (delegates == null || delegates.Length == 0)
    return null;

  Delegate? d = delegates[0];
  for (int i = 1; i < delegates.Length; i++)
    d = Combine(d, delegates[i]);

  return d;
}
Nullable ve Optional'ın Beraber Kullanımı
Şöyle yaparız.
public string MethodName(string str, int? x = null)
{
  if(x != null)
  {
    ....
  }
}
Çağırmak için şöyle yaparız.
MethodName("AValue",10); // str = AValue and x=10
Ya da şöyle yaparız.
MethodName("AValue"); // str = AValue and x=null

Hiç yorum yok:

Yorum Gönder