SORU
29 Mart 2012, PERŞEMBE


Kirli yöntem salt-okunur bir alan için denir

KullanıyorumVisual Studio 2010Resharperve aşağıdaki kodu ile ilgili bir uyarı gösterir:

if (rect.Contains(point))
{
    ...
}

rect bana bu uyarı gösterir Resharper ** 5 bir alan, ve:

"Kirli Yöntemi değer türü salt okunur alan denir."

Saf olmayan yöntemleri nelerdir ve neden bu uyarı benim için gösteriliyor?

CEVAP
29 Mart 2012, PERŞEMBE


Öncelikle, Jon Michael ve Jared'in cevaplar aslında doğru ama eklemek istediğim birkaç şey daha var.

Bir "" yöntem? iffetsiz ne demektir

Daha kolay saf yöntemleri karakterize edilir. Bir "saf" yöntemi aşağıdaki özelliklere sahiptir:

  • Çıkışını tamamen kendi giriş tarafından belirlenir; çıkış saati ya da sabit diskinizdeki bit gibi dış etmenler bağlı değildir. Onun çıkış tarihi bağlı değildir; belirli bir değişken ile iki kez yöntemi çağrısı, aynı sonucu verecektir.
  • Saf bir yöntem dünyanın hiçbir gözlemlenebilir mutasyonlar üretir. Saf bir yöntem verimliliği aşkına özel devlet mutasyona tercih edebilir, ama saf bir yöntem, diyelim ki, bağımsız bir alan mutasyona değildir.

Örnek olarak, Math.Cos saf bir yöntem. Onun çıkış tek giriş bağlıdır, ve giriş arama tarafından değiştirilir.

Saf olmayan bir yöntem saf olmayan bir yöntemdir.

Saf olmayan yöntemler için salt okunur yapılar geçen tehlikeleri nelerdir?

Akla gelen iki vardır. Birincisi tek Jon Michael ve Jared tarafından işaret edilir, ve bu Resharper hakkında uyarı olur. Bir yapı üzerinde bir yöntemini çağırdığınızda, bu yöntem değişken değişmek istiyor diye her zaman alıcı değişken için bir referans geçirir.

Eğer bir değer, böyle bir yöntem yerine bir değişken diyorsunuz? Bu durumda geçici bir değişken yapıyoruz, değeri kopyalayın ve değişken için bir referans geçirir.

Salt okunur bir değişken kurucu dışında mutasyona uğramış edilemez, çünkü bir değer olarak kabul edilir. Başka bir değişken için değişken kopyalama, ve kirli yöntemi muhtemelen değişken mutasyona istediğinizde kopya, mutasyona uğruyor.

Bu gibi salt okunur bir yapı geçirme tehlikesi varalıcı. Ayrıca, salt okunur bir alan içeren bir yapı geçirme tehlikesi vardır. Bir yapı içeren bir salt okunur alan yaygın bir uygulama, ama aslında yazılı bir çek türü sistemi henüz fonlarına nakit; "salt okunur-ness" belirli bir değişken tarafından belirlenir sahibinin depolama. Başvuru türünün bir örneği "" kendi depolama, ama değer türünün bir örneği değil sahibi!

struct S
{
  private readonly int x;
  public S(int x) { this.x = x; }
  public void Badness(ref S s)
  {
    Console.WriteLine(this.x);   
    s = new S(this.x   1);
    // This should be the same, right?
    Console.WriteLine(this.x);   
  }
}

this.x x salt okunur bir alan olduğu için değişmeyecek ve Badness yapıcı olmadığını düşünüyor. Ama...

S s = new S(1);
s.Badness(ref s);

... açıkça yanlışlığını gösterir. this s aynı değişken ve bakınbudeğişken salt okunur değil!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • grickle

    grickle

    22 AĞUSTOS 2006
  • Within Temptation

    Within Tempt

    18 EYLÜL 2006