Отмена инициализации объекта выполняется путем исключения исключения в конструкторе и рекомендуется отклонять недопустимый ввод.
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);
}
}
методом грубой силы, установите все поля в нуль, добавить объект с нулевыми полями, удалите объект – RhysW
Это может быть просто пример кода, но в случае, если это не так: Вы можете поставить предикат 'Любой ', поэтому вам не нужно проходить' Where'. –
@BrianRasmussen Оба имеют тот же результат, поэтому это личное предпочтение, которое вы используете. С другой стороны, вызов «ToList» предотвращает короткое замыкание «Any'», не оценивая весь запрос. – Servy