SORU
28 EYLÜL 2011, ÇARŞAMBA


C parametresi kontrol Null#

C#, her fonksiyon, parametre null kontrolleri ekleyerek nereye null geçerli bir değer olmadığı için herhangi bir iyi nedenler (daha iyi hata mesajı dışında) var mı? Belli ki, s kullandığı kod bir özel durum yine de atacağım. Ve bu tür kontrol kod daha yavaş ve daha zor korumak için.

void f(SomeType s)
{
  if (s == null)
  {
    throw new ArgumentNullException("s cannot be null.");
  }

  // Use s
}

CEVAP
28 EYLÜL 2011, ÇARŞAMBA


Evet, iyi bir nedeni vardır:

  • Null aynen, NullReferenceException bir açık olmayabilir hangi tanımlar
  • Eğer başka bir koşul değeri başvuru yapıldı değil anlamına geliyorsa bile kodu geçersiz giriş başarısız yapar
  • Bu durum meydana geliyoröncebu yöntem yan etkiler ilk önce başvuru ulaşırsınız başka olabilir
  • Eğer başka bir şeye parametre geçirirseniz, ihlal değilsin emin olabilirsiniz demektironlarınsözleşme
  • Senin yöntemin gereksinimleri (Code Contracts kullanarak tabii ki bunun için daha hayırlıdır) bunu belgelemektedir

Buna neden itiraz ettiğini şimdi olduğu gibi:

  • YavaşBu seni buldukaslındakodunuzda darboğaz olabilir, ya da tahmin ediyorsun? Hiçlik, kontroller çok hızlı ve vakaların büyük çoğunluğudeğilgidiş darboğaz olacak
  • Kodu korumak için daha zor hale getirir: Tam tersini düşünüyorum. Bencedaha kolaybir parametre ister berrak nerede yapıldığını kodu kullanmak şartıyla zorunlu tutulduğu yeri boş, ve olabilir.

Ve onayınız için

Belli ki, s kullandığı kod bir özel durum yine de atacağım.

Gerçekten mi? Düşünün:

void f(SomeType s)
{
  // Use s
  Console.WriteLine("I've got a message of {0}", s);
}

O s ama bir istisna değil kullanır. s boş olmak için geçersiz ve yanlış bir şey olduğunu gösterir, bu konuda bir istisna en uygun davranıştır.

Şimdinerededoğrulama denetimleri farklı bir konudur bu argüman koymak. Kendi sınıfı içindeki tüm kodu güven, çok özel yöntemler rahatsız etmeye karar verebilir. Derleme kalan güven, öyle değil iç yöntemleri rahatsız etmeye karar verebilir. Neredeyse kesinlikle ortak yöntem bağımsız değişkenleri doğrulamak gerekir.

Yan not: ArgumentNullException tek parametre oluşturucu aşırı daha yeni test edilmesi gereken çok parametre adı olmalıdır:

if (s == null)
{
  throw new ArgumentNullException("s");
}

Alternatif olarak bir uzantı yöntemi, biraz terser izin oluşturabilirsiniz:

s.ThrowIfNull("s");

(Genel) uzatma yöntemi benim hikayemde, eğer sigara null, gibi şeyler yazmak için izin eğer orijinal değer geri dönüş yapıyorum:

this.name = name.ThrowIfNull("name");

Ayrıca eğer çok bu konuda rahatsız iseniz parametre adı Al, olmayan aşırı yüklenme olabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • NikkoNantone

    NikkoNantone

    21 Kasım 2011
  • SHAYTARDS

    SHAYTARDS

    1 EKİM 2008
  • williamfitzsimmons

    williamfitzs

    14 Mart 2008