Как я могу поставить проверки в методах получения и установки в C #? - PullRequest
7 голосов
/ 30 ноября 2010

В C # у меня может быть свойство без необходимости объявления частной переменной. Мой код VB6, который выглядел так

'local variable(s) to hold property value(s)
Private mvarPhoneNumber As String 'local copy
Public Property Let PhoneNumber(ByVal vData As String)
'used when assigning a value to the property, on the left side of an assignment.
'Syntax: X.PhoneNumber = 5
    mvarPhoneNumber = vData
End Property


Public Property Get PhoneNumber() As String
'used when retrieving value of a property, on the right side of an assignment.
'Syntax: Debug.Print X.PhoneNumber
    PhoneNumber = mvarPhoneNumber
End Property

теперь может выглядеть так.

public string PhoneNumber{get;set;}

Как я могу поставить валидацию в методах получения и установки в C #? Я попытался добавить проверку, как это.

public string PhoneNumber
        {
            get
            {
                return PhoneNumber;
            }
            set
            {
                if (value.Length <= 30)
                {
                    PhoneNumber = value;
                }
                else
                {
                    PhoneNumber = "EXCEEDS LENGTH";
                }
            }
        }

Часть get этого кода не скомпилируется. Нужно ли возвращаться к использованию закрытой переменной?

Ответы [ 5 ]

18 голосов
/ 30 ноября 2010

Да, вам нужно создать вспомогательное поле:

string _phoneNumber;

public string PhoneNumber
{
    get
    {
        return _phoneNumber;
    }
    set
    {
        if (value.Length <= 30)
        {
            _phoneNumber = value;
        }
        else 
        {
            _phoneNumber = "EXCEEDS LENGTH";
        }
    }
}

Имейте в виду, что эта реализация ничем не отличается от автоматически реализуемого свойства. Когда вы используете автоматически реализованное свойство, вы просто позволяете компилятору создать для вас вспомогательное поле. Если вы хотите добавить любую пользовательскую логику к get или set, вы должны создать поле самостоятельно, как я показал выше.

2 голосов
/ 30 ноября 2010

Я бы сделал что-то подобное, чтобы избежать NullReferenceException, а также сократить общий код.

public string PhoneNumber
{
    get { return _phoneNumber; }
    set 
    {
        var v = value ?? string.Empty; 
        _phoneNumber = v.Length <= 30 ? v : "EXCEEDS LENGTH"; 
    }
}
private string _phoneNumber;
2 голосов
/ 30 ноября 2010

Вам не обязательно нужна локальная переменная.Теоретически вы можете реализовать любую функциональность, которую захотите, в свойстве get / set.Но в вашем примере у вас есть рекурсивный доступ к вашему свойству get / set, что не имеет смысла в том, как оно реализовано.Итак, в вашем конкретном случае вам понадобится локальная переменная, это правильно.

1 голос
/ 30 ноября 2010

Ищите здесь несколько вариантов: Доступ к полю поддержки в свойстве auto

Но краткий ответ - Да, вам потребуется поле подтверждения для проверки.

1 голос
/ 30 ноября 2010

Да, вы делаете. Когда вы используете ярлык «неявный» синтаксис, он тайно создает вспомогательное поле с именем _phoneNumber для вас. Когда вы явно определяете свое свойство, вам нужно создать собственное вспомогательное поле. Прямо над определением вашей собственности введите:

private string _phoneNumber;

и тогда в вашей собственности получите использование:

get
{
    return _phoneNumber;
}
...