通過在構造函數中拋出異常來中止對象的初始化,並且建議拒絕無效輸入。
public class User
{
public User(String name) {
if (String.IsNullOrWhiteSpace(name)) {
if (name == null) {
throw new System.ArgumentNullException("Cannot be null.", "name");
}
else {
throw new System.ArgumentException("Cannot be empty.", "name");
}
}
}
}
您希望在構造函數中定義的業務邏輯不適合此處。構造函數應該是輕量級的,僅僅是實例化的。查詢某些數據源對於構造函數來說太昂貴了。因此,您應該使用工廠模式。在工廠模式下,調用者可能會期望在創建對象時會出現一些繁重的工作。
public class User
{
private User(String name) {
if (String.IsNullOrWhiteSpace(name)) {
if (name == null) {
throw new System.ArgumentNullException("Cannot be null.", "name");
}
else {
throw new System.ArgumentException("Cannot be empty.", "name");
}
}
}
public static User CreateUser(String name) {
User user = new User(name); // Lightweight instantiation, basic validation
var matches = allUsers.Where(q => q.Name == name).ToList();
if(matches.Any())
{
throw new System.ArgumentException("User with the specified name already exists.", "name");
}
Name = name;
}
public String Name {
get;
private set; // Optionally public if needed
}
}
你可以看到工廠模式更適合的,因爲它是一個方法調用者可能認爲會有一些工作通過調用了怎麼回事。而對於構造函數,人們會認爲它是輕量級的。
如果你想去構造函數的路線,那麼你會想嘗試一些其他的方法來強制執行業務規則,例如試圖插入數據源的時候。
public class User
{
public User(String name) {
if (String.IsNullOrWhiteSpace(name)) {
if (name == null) {
throw new System.ArgumentNullException("Cannot be null.", "name");
}
else {
throw new System.ArgumentException("Cannot be empty.", "name");
}
}
}
}
public class SomeDataSource {
public void AddUser(User user) {
// Do your business validation here, and either throw or possibly return a value
// If business rules pass, then add the user
Users.Add(user);
}
}
蠻力的方式,將所有字段設置爲null,與空字段添加對象,刪除對象 – RhysW
這可能只是示例代碼,但如果它不是:你可以提供一個謂詞任何' ',所以你不必經過'Where'。 –
@BrianRasmussen兩者具有完全相同的結果,所以它確實是您使用的個人偏好。另一方面,「ToList」調用可防止「Any」短路而不評估整個查詢。 – Servy