C # - Проверьте, установлено ли целочисленное свойство - PullRequest
8 голосов
/ 10 мая 2011

Я проверяю некоторые свойства, и мне нужно знать, установлены ли длинные или целые значения другими слоями.

Например, этот класс ::

public class Person 
{
    public int Age {get;set;}
}

Когда я устанавливаю новый экземпляр Person , Age получает значение 0. Но я должен проверить, были ли установлены Age , потому что Возраст может быть нулем (конечно, не в этом контексте).

Одно из решений, о котором я подумал, - это использовать int как обнуляемое целое число ( public int? Age ), а в конструкторе Person установить Age как null.

Но я пытаюсь избежать этого, потому что мне нужно изменить слишком много классов, просто чтобы проверить, если Age.HasValue и использовать его как Age.Value .

Есть предложения?

Ответы [ 3 ]

20 голосов
/ 10 мая 2011

Int по умолчанию инициализируются на 0;Предполагая, что вы не хотите использовать int?, который идеально подходит для вас.Вы можете проверить это или у вас может быть флаг и вспомогательное поле:

private int _age;
public int Age 
{ 
  get { return _age; } 
  set { _age = value; _hasAge = true; } 
}

public bool HasAge { get { return _hasAge; } }

Как указано выше, вы можете инициализировать его в недопустимое состояние:

private int _age = -1;
public int Age 
{ 
  get { return _age; } 
  set { _age = value; _hasAge = true; } 
}

public bool HasAge { get { return _age != -1; } }

Или просто сломатьи используйте int?

public int? Age { get; set; }
public bool HasAge { get { return Age.HasValue; } }

Для обратной совместимости с вашим кодом вы можете отменить его int?, не раскрывая его:

private int? _age;
public int Age
{
  get { return _age.GetValueOrDefault(-1); }
  set { _age = value; }
}

public bool HasAge { get { return _age.HasValue; } }
6 голосов
/ 10 мая 2011

Существует нет разницы между полем (или автоматически реализованным свойством), для которого явно установлено значение по умолчанию, и тем, которое никогда не было установлено.

A Nullable<int> - определенно способ пойти сюда, но вам нужно рассмотреть самый чистый API для использования.

Например, вы можете захотеть:

public class Person 
{
    private int? age;

    public int Age
    {
        // Will throw if age hasn't been set
        get { return age.Value; }
        // Implicit conversion from int to int?
        set { age = value; }
    }

    public bool HasAge { get { return age.HasValue; } }
}

Это будетпозволяют читать Age непосредственно в местах, которые предполагают, что установлено, но проверяйте это, когда они хотят быть осторожными.

1 голос
/ 10 мая 2011

Независимо от того, какой шаблон вы используете, перед тем, как вы получите значение, вам нужно будет выполнить запрос "установлен", поэтому ...

Используйте пустое поле int? age, которое используют ваши свойства get / set, и запросите свойство IsAgeSet:

public class Person  
{ 
    private int? age;

    public int Age {
        get {return age.Value;} // will fail if called and age is null, but that's your problem......
        set {age = value;}
    }
    public bool IsAgeSet {
        get {return age.HasValue;}
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...