Ошибка при вводе пользователем null или пустой строки
Я пытаюсь решить следующее упражнение:
вам нужно создать класс с именем
Productчто представляет собой продукт. Класс имеет одно свойство с именемName. ПользователиProductкласс должен иметь возможность получить и установить значениеNameсобственность. Однако, любая попытка установить значениеNameк пустой строке или нулю значение должно вызывать исключение. Кроме того, пользователиProductкласс не должно быть доступа к другим данные членыProductкласс. Как вы создадите такой класс?
Я создал следующий код, но по какой-то причине он не бросает исключение, если строка является недопустимым:
class Program
{
static void Main(string[] args)
{
Product newProduct = new Product();
Console.WriteLine("Enter Product name:");
newProduct.Name = null; //Console.ReadLine();
Console.WriteLine("Product name is : {0}", newProduct.Name);
Console.ReadLine();
}
}
class Product
{
private string name;
public string Name
{
get
{
return this.name;
}
set
{
if (Name != String.Empty || Name != null)
{
name = value;
}
else
{
throw new ArgumentException("Name cannot be null or empty string", "Name");
}
}
}
}
исключение не бросается, потому что у меня нет try-catch заявление?
Мне также было интересно, возможно ли иметь только оператор catch без оператора try?
3 ответов
код if государство-это неправильно. Давайте сделаем таблицу правды:
if (value != String.Empty || value != null)
Name = null True Or False = True
Name = "name" True Or True = True
Name = "" False Or True = True
ваше заявление if всегда истинно!
Я бы переписал его так:
if (value == String.Empty || value == null)
{
throw new ArgumentException("Name cannot be null or empty string", "Name");
}
else
{
name = value;
}
вы можете просто изменить или на И И, но я думаю, что выше читается лучше (ниже есть ненужный двойной отрицательный):
if (value != String.Empty && value != null)
{
name = value;
}
else
{
throw new ArgumentException("Name cannot be null or empty string", "value");
}
как говорит Дмитрий Быченко, я не заметил, что вы не тестируете на value. In геттеры вы должны использовать value свойства. Не имя код свойства
второй параметр (опять же указанный Дмитрием Быченко) в вашем исключении должен быть:
имя параметра, вызвавшего текущее исключение.
который в вашем случае является строкой "value":
throw new ArgumentException("Name cannot be null or empty string", "value");
использовать String.IsNullOrEmpty Method (String). Измените свой set такой:
set
{
if (!string.IsNullOrEmpty(value))
{
name = value;
}
else
{
throw new ArgumentException("Name cannot be null or empty string", "value");
}
}
также вы можете использовать String.IsNullOrWhiteSpace Method (String) это указывает, является ли указанная строка нулевой, пустой или состоит только из пробелов.
если вы хотите разные исключения null и пустой строка (часто null значит что-то совершенно неправильно, когда пустая строка-это просто ошибка формата):
public string Name {
get {
return name;
}
set {
if (null == value)
throw new AgrumentNullException("value");
else if (String.Equals(value, ""))
throw new AgrumentException("Empty values are not allowed.", "value");
name = value;
}
}
в случае, если вы не хотите distiguish них:
public string Name {
get {
return name;
}
set {
if (String.IsNullOrEmpty(value))
throw new AgrumentException("Null or empty values are not allowed.", "value");
name = value;
}
}
обратите внимание, что в обоих случаях это value что вы должны проверить, а не свойство Name. В исходном коде nameх (и так Name а) начальной стоимостью is null и вы получите исключение все вы пытаетесь установить.