Ошибка при вводе пользователем 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 свойства. Не имя код свойства


второй параметр (опять же указанный Дмитрием Быченко) в вашем исключении должен быть:

имя параметра, вызвавшего текущее исключение.

MSDN

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