通过在构造函数中抛出异常来中止对象的初始化,并且建议拒绝无效输入。
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