[英]Should I assign class fields via property setter or not in C#?
正确的做法是什么? 属性设置器可能包含的代码不仅仅包括权限分配。 可以说我有以下代码:
class Person
{
private String name;
public Person(String name)
{
this.name = Name
}
public String Name
{
get;
set {
if(String.Empty.Equals(value)) return;
this.name = value;
}
}
}
上面的代码是否错误,因为我没有通过属性分配?
Name
而不是字段name
,以确保始终使用get
/ set
方法中的逻辑。 set
实现,因此还必须显式指定get
实现以供示例编译。 String.IsNullOrEmpty
,而不要使用其他方法,例如String.Empty.Equals(value)
代码。 属性通常应该表现得毫不奇怪。 运行person.Name = "";
,您希望Name
属性为""
,而不是以前的属性。 如果设置null或空名称无效,则在传递此类值时应引发异常。
class Person { private String name; public Person(String name) { this.Name = name; } public String Name { get { return this.name; } set { if(String.IsNullOrEmpty(value)) throw new ArgumentException("Name is required", "value"); this.name = value; } } }
属性的行为应该毫不奇怪。 这意味着如果我这样做:
someObject.SomeProperty = someValue;
然后,执行以下操作后,要么满足以下条件(假设属性的类型允许比较),要么应引发异常:
someObject.SomeProperty == someValue;
以您的示例为例,如果您不希望调用者将属性设置为null或空字符串,那么您应该抛出ArgumentException
:
public String Name
{
get
{
return this.name;
}
set
{
if (string.IsNullOrEmpty(value))
throw new ArgumentException("value");
this.name = value;
}
}
我不希望看到这种情况:
myObject.Name = "Fred";
// ... Lots of code
myObject.Name = "";
string test = myObject.Name;
// Now test == "Fred" wtf?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.