Bir mülk ayarlayıcı veya alıcıdan istisnalar atma ihtiyacını hissediyorsanız, tasarımda bir kusur olduğunu kesinlikle iddia ederim.
Özellik, yalnızca değer olan bir şeyi temsil eden bir soyutlamadır . Ve bunun bir istisna oluşturabileceğinden korkmadan bir değer ayarlayabilmelisiniz. *
Özelliğin ayarlanması bir yan etkiye yol açarsa, bunun gerçekten bir yöntem olarak uygulanması gerekir. Ve eğer herhangi bir yan etki üretmezse, bir istisna atılmamalıdır.
Farklı bir cevapta daha önce bahsedilen bir örnek mülktür Stream.Position
. Bu yan etkiler yaratır ve istisnalar atabilir. Ancak bu özellik ayarlayıcı, temelde Stream.Seek
bunun yerine arayabileceğiniz bir sarıcıdır.
Şahsen, pozisyonun yazılabilir bir özellik olmaması gerektiğine inanıyorum.
Bir özellik ayarlayıcısından istisna atmak için cazip olabileceğiniz başka bir örnek, verilerin doğrulanmasıdır:
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
Ancak bu soruna daha iyi bir çözüm var. Geçerli bir e-posta adresini temsil eden bir tür girin:
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
Email
Sınıf geçerli bir e-posta adresi olmayan bir değer tutamayacak sağlar ve sınıflar mağaza e-postalara gerek bunları onaylama görevden ki.
Bu aynı zamanda daha yüksek bir bütünlüğe (iyi yazılım tasarımının bir göstergesi) yol açar - bir e-posta adresinin ne olduğu ve nasıl doğrulandığına dair bilgi Email
, yalnızca bu endişeye sahip olan sınıfta bulunur.
* ObjectDisposedException şu anda düşünebildiğim tek geçerli istisnadır (pun amaçlı değil).