SORU
10 Ocak 2014, Cuma


Bu iki satır aynı, 'vardır? ... :' vs '??'?

Bu iki satır arasında bir fark var mı?

MyName = (s.MyName == null) ? string.Empty : s.MyName

ya

MyName = s.MyName ?? string.Empty

CEVAP
10 Ocak 2014, Cuma


GÜNCELLEME: daha fazla bu konuyu derinlemesine anlatıldığı bir blog yazısı yazdım. http://www.codeducky.org/properties-fields-and-methods-oh-my/


Genellikle aynı sonucu dönecektir. Ancak, bazı durumlarda, sen-ecek deneyim gözle görülür farklar MyName bir özellik, çünkü MyName alıcı işlenir iki kez ilk örnek ve yalnızca bir kez ikinci örnek.

Örneğin, iki kez MyName yürütülmesini performans farklılıkları karşılaşabilirsiniz:

string MyName
{
    get 
    {
        Thread.Sleep(10000);
        return "HELLO";
    }
}

Ya da eğer MyName durum bilgisi ise iki kez MyName yürütme farklı sonuçlar alabilirsiniz:

private bool _MyNameHasBeenRead = false;

string MyName
{
    get 
    {
        if(_MyNameHasBeenRead)
                throw new Exception("Can't read MyName twice");
        _MyNameHasBeenRead = true;
        Thread.Sleep(10000);
        return "HELLO";
    }
}

Ya da eğer MyName farklı bir iş parçacığı üzerinde değiştirilebilir iki kez MyName yürütülmesini farklı sonuçlar alabilirsiniz:

void ChangeMyNameAsync()
{
    //MyName set to null in another thread which makes it 
    //possible for the first example to return null
    Task.Run(() => this.MyName = null);
}

string MyName { get; set; }  

Gerçek kod derlendi. İlk üç ifade ile parça:

IL_0007:  ldloc.0     // s
IL_0008:  callvirt    s.get_MyName       <-- first call
IL_000D:  brfalse.s   IL_0017
IL_000F:  ldloc.0     // s
IL_0010:  callvirt    s.get_MyName       <-- second call
IL_0015:  br.s        IL_001C
IL_0017:  ldsfld      System.String.Empty
IL_001C:  call        set_MyName

ve burada boş birleşiyor operatör ile parça

IL_0007:  ldloc.0     // s
IL_0008:  callvirt    s.get_MyName       <-- only call
IL_000D:  dup         
IL_000E:  brtrue.s    IL_0016
IL_0010:  pop         
IL_0011:  ldsfld      System.String.Empty
IL_0016:  call        s.set_MyName

Gördüğünüz gibi üçlü operatör için derlenmiş kodu boş birleşiyor, operatör sadece 1 ise iki telefon özellik değerini almak için yapacak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C#

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Leigh Momii

    Leigh Momii

    10 Mayıs 2006
  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008
  • Māris Zaharovs

    Māris Zahar

    28 Mayıs 2008