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

问题描述 投票:7回答:5

在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部分将无法编译。我是否需要恢复使用私有变量?

c# .net vb6 syntax automatic-properties
5个回答
18
投票

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

string _phoneNumber;

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

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


2
投票

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


2
投票

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

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

1
投票

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

private string _phoneNumber;

然后在你的财产中使用:

get
{
    return _phoneNumber;
}

1
投票

看看这里有几个选择:Acessing the backing field in an auto property

但简短的回答是肯定的,你必须有验证的支持领域。

© www.soinside.com 2019 - 2024. All rights reserved.