在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部分将无法编译。 我是否需要恢复使用私有变量?
答案 0 :(得分:18)
是的,您必须创建一个支持字段:
string _phoneNumber;
public string PhoneNumber
{
get
{
return _phoneNumber;
}
set
{
if (value.Length <= 30)
{
_phoneNumber = value;
}
else
{
_phoneNumber = "EXCEEDS LENGTH";
}
}
}
请记住,此实现与自动实现的属性没有区别。当您使用自动实现的属性时,您只需允许编译器为您创建支持字段。如果您要向get
或set
添加任何自定义逻辑,您必须自己创建字段,如上所示。
答案 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
但简短的回答是肯定的,您必须有验证的支持字段。