如何在C#中的getter和setter方法中进行验证?

时间:2010-11-30 20:35:31

标签: c# .net vb6 syntax automatic-properties

在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#中的getter和setter方法中进行验证? 我尝试添加这样的验证。

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

此代码的get部分将无法编译。 我是否需要恢复使用私有变量?

5 个答案:

答案 0 :(得分:18)

是的,您必须创建一个支持字段:

string _phoneNumber;

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

请记住,此实现与自动实现的属性没有区别。当您使用自动实现的属性时,您只需允许编译器为您创建支持字段。如果您要向getset添加任何自定义逻辑,您必须自己创建字段,如上所示。

答案 1 :(得分:2)

您不一定需要本地变量。从理论上讲,您可以在get / set属性中实现所需的任何功能。但是,在您的示例中,您对get / set属性进行了递归访问,这对其实现方式没有任何意义。所以,在你的具体案例中,你需要一个局部变量,这是正确的。

答案 2 :(得分:2)

我会这样做,以避免NullReferenceException以及缩短整体代码。

public string PhoneNumber
{
    get { return _phoneNumber; }
    set 
    {
        var v = value ?? string.Empty; 
        _phoneNumber = v.Length <= 30 ? v : "EXCEEDS LENGTH"; 
    }
}
private string _phoneNumber;

答案 3 :(得分:1)

是的,你这样做。当您使用快捷方式“隐式”语法时,它会秘密为您创建一个名为_phoneNumber的支持字段。明确定义属性时,需要创建自己的支持字段。在您的属性定义正上方放置:

private string _phoneNumber;

然后在你的财产中使用:

get
{
    return _phoneNumber;
}

答案 4 :(得分:1)

在这里查看几个替代方案: Acessing the backing field in an auto property

但简短的回答是肯定的,您必须有验证的支持字段。