18 Şubat 2015 Çarşamba

Coalesce

Giriş
Coalesce kelimesi co - alescere (Latince) kelimelerinden oluşuyor. Ben birleştirme diye çevirdim.

Coalesce (null birleştirme) bazı programlama dillerinde bulunan bir metod. Verilen bir çok parametreyi tek bir sonuç haline getiriyor. Yani birleştiriyor. Bunu yaparken null olmayan ilk değeri döndürüyor.

SQL
Örnek:
COALESCE(a,b,c)

C#
Null Coalescing Operator yazısına taşıdım.

Java
Java'da bu metod yok. Ancak yazması da çok kolay. Örnek:
public static <T> T coalesce(T a, T b) {
    return a != null ? a : b;
}
public static <T> T coalesce(T a, T b, T c) {
    return a != null ? a : coalesce(b,c);
}
public static <T> T coalesce(T a, T b, T c, T d) {
    return a != null ? a : coalesce(b,c,d);
}
public static <T> T coalesce(T a, T b, T c, T d, T e) {
    return a != null ? a : coalesce(b,c,d,e);
}

Propagate
Null Propagating Operator C# 6 ile geliyor/gelecek.

?. şeklinde kullanılıyor. Yani eskiden nokta ile kullandığımız yere ? işaretini de ekliyoruz.

Coalesce ile aynı şey değil ancak ilgili olduğu için aynı yazıya taşıdım. Bir nesnenin property'si ile çalışırken sürekli null kontrolü yapmamak için kullanılıyor.

Nested Property İçin Kullanımı
Önce nesnenin iç içe propertylerine erişimi nasıl yaptığımıza bakalım.
Eskiden böyle yazardır
StringBuilder stringBuilder = new StringBuilder();
//Wanted object can be even deeper
if (root != null &&
    root.InnerObject1 != null &&
    root.InnerObject1.InnerObject2 != null &&
    root.InnerObject1.InnerObject2.InnerObject3 != null &&
    root.InnerObject1.InnerObject2.InnerObject3.value != null)
{
    stringBuilder.Append(root.InnerObject1.InnerObject2.InnerObject3.value)
}
Şimdi sadece böyle yazıyoruz.
var value = root?.InnerObject2?.InnerObject2?.InnerObject3?.value;
if(value != null)
    stringBuilder.Append(value);
Nested Property'nin Nullable İle Kullanımı
Yukarıdaki koddan farklı değil. İstersek değer yine bir nullable alana atayabiliriz.

Type? v = x?.y?.z; 
Nested Property'nin bir metodunu Çağırmak
Bu da mümkün.
this.AnalyzerLoadFailed?.Invoke(...);
Bu kod aslında şuna denk gelir.
if( this.AnalyzerLoadFailed != null)
    this.AnalyzerLoadFailed.Invoke(...);




Hiç yorum yok:

Yorum Gönder