Evet, iyi sebepler var:
- Neyin null olduğunu tam olarak tanımlar, ki bu bir
NullReferenceException
- Başka bir koşul değerin referans alınmadığı anlamına gelse bile, kodun geçersiz girişte başarısız olmasına neden olur.
- Yöntemin ilk başvurudan önce ulaşabileceğiniz başka yan etkilere sahip olmasından önce istisnayı meydana getirir.
- Bu, parametreyi başka bir şeye aktarırsanız, onların sözleşmesini ihlal etmediğinizden emin olabileceğiniz anlamına gelir.
- Yönteminizin gereksinimlerini belgeler ( Kod Sözleşmelerini kullanmak elbette bunun için daha iyidir)
Şimdi itirazlarınıza gelince:
- Bu yavaş var : Var Eğer buldum aslında Kodunuzdaki darboğaz olur, yoksa tahmin edilmektedir? Hükümsüzlük kontroller çok hızlı, ve vakaların büyük çoğunluğunda onlar konum değil darboğaz olacak
- Kodun korunmasını zorlaştırıyor : Bence tam tersi. Bence, bir parametrenin boş olup olmadığına ve bu koşulun uygulandığından emin olduğunuzda açıkça anlaşıldığı yerlerde kodu kullanmak daha kolaydır .
Ve iddianız için:
Açıkçası, s kullanan kod yine de bir istisna atacaktır.
Gerçekten mi? Düşünmek:
void f(SomeType s)
{
Console.WriteLine("I've got a message of {0}", s);
}
Bu kullanır s
, ancak bir istisna oluşturmaz. İçin geçersiz ise s
boş olması ve bu bir şeyler olduğu anlamına yanlış gösterir, bir istisna burada en uygun davranıştır.
Şimdi bu argüman doğrulama kontrollerini nereye koyduğunuz farklı bir konudur. Kendi sınıfınızdaki tüm koda güvenmeye karar verebilirsiniz, böylece özel yöntemlerle uğraşmayın. Toplantınızın geri kalanına güvenmeye karar verebilirsiniz, bu yüzden dahili yöntemlerle uğraşmayın. Herkese açık yöntemler için argümanları neredeyse kesinlikle doğrulamalısınız.
Bir yan not: tek parametreli oluşturucu aşırı yüklemesi ArgumentNullException
yalnızca parametre adı olmalıdır, bu nedenle testiniz şöyle olmalıdır:
if (s == null)
{
throw new ArgumentNullException("s");
}
Alternatif olarak, biraz terser'e izin veren bir genişletme yöntemi oluşturabilirsiniz:
s.ThrowIfNull("s");
Benim (jenerik) uzantı yöntemi sürümümde, boş değilse orijinal değeri döndürmesini sağlıyorum, aşağıdaki gibi şeyler yazmanıza izin veriyor:
this.name = name.ThrowIfNull("name");
Ayrıca, bu konuda çok endişelenmiyorsanız, parametre adını almayan bir aşırı yüklemeye de sahip olabilirsiniz.