Ошибка при вводе пользователем 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
и вы получите исключение все вы пытаетесь установить.