7

在 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 部分不会编译。我需要恢复使用私有变量吗?

4

5 回答 5

18

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

string _phoneNumber;

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

请记住,此实现与自动实现的属性没有什么不同。当您使用自动实现的属性时,您只是允许编译器为您创建支持字段。如果您想向 中添加任何自定义逻辑,get或者set您必须自己创建字段,如上所示。

于 2010-11-30T20:36:30.307 回答
2

您不一定需要局部变量。从理论上讲,您可以在get/set属性中实现您想要的任何功能。但是,在您的示例中,您可以递归访问get/set属性,这在实现方式上没有任何意义。因此,在您的具体情况下,您将需要一个局部变量,这是正确的。

于 2010-11-30T20:40:41.833 回答
2

我会做这样的事情来避免NullReferenceException和缩短整体代码。

public string PhoneNumber
{
    get { return _phoneNumber; }
    set 
    {
        var v = value ?? string.Empty; 
        _phoneNumber = v.Length <= 30 ? v : "EXCEEDS LENGTH"; 
    }
}
private string _phoneNumber;
于 2010-11-30T20:41:11.587 回答
1

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

private string _phoneNumber;

然后在您的财产中使用:

get
{
    return _phoneNumber;
}
于 2010-11-30T20:37:50.890 回答
1

在此处查找多种替代方法: 访问自动属性中的支持字段

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

于 2010-11-30T20:39:47.410 回答