Во многих (всех?) Ответах говорится, что нужно выбросить исключение, но я уверен, что видел официальные заявления команды разработчиков фреймворка, которые рекомендуют не создавать исключения из конструкторов.
Обратите внимание, что классы в .NET Framework, которые ведут себя аналогично вашему примеру "Banana" (где для создания экземпляра объекта подходят только определенные значения), не используют конструкторы, а вместо этого используют статические фабричные методы. Например, System.Net.WebRequest не имеет открытого конструктора и вместо этого использует статический метод Create , который может вызвать исключение, если предоставленная строка не является допустимым URI. За некоторыми исключениями - см. Мое обновление ниже.
Итак, для вашего кода я бы изменил конструктор Banana на защищенный и ввел метод, подобный этому:
public static Banana Create(string color)
{
if (color != "green" && color != "yellow")
{
throw new ArgumentException("Color must be 'green' or 'yellow'",
"color");
}
return new Banana(color);
}
Обновление
Ладно, похоже, это не плохая идея выбросить исключения из конструктора. Фактически, System.IO.FileStream делает именно это, если вы передаете неверное имя файла его конструктору. Я предполагаю, что идея использования статического метода фабрики - это всего лишь один из способов более подробно рассказать о том, как вы создаете экземпляр (например, если вышеприведенный метод назывался «FromColor»).