我已经看到get / set属性可以以两种不同的方式使用:
没有任何逻辑:
public string PublicString { get; set; }
使用逻辑,将值传递给后备字段。
private string backingString;
public string PublicString
{
Get
{
Return backingString;
}
Set
{
If (value != “”)
{
backingString = value;
}
}
}
问题:
由于
答案 0 :(得分:3)
上面的简短表单会自动为属性创建一个支持字段,以及一个仅返回或设置支持字段值的getter和setter。
如果您决定手动实施getter和setter,则无需具有支持字段。实际上,您可以实现所需的任何逻辑(例如,从另一个字段中获取值)。但是,属性getter和setter的常见做法是轻量级,因为这符合调用者的期望。如果你需要很多逻辑我属性,方法是一种更好的方法,应该被命名,以便将它们的目的传达给调用者。
如果要将值存储在某处,则支持字段是常用方法(除非将值存储在其他位置)。如您在示例中所示(PublicString = value),将值赋值给属性本身是不行的,因为它再次调用setter并以无限循环结束。
如果未能设置该值,则可以通过抛出异常将其传达给调用者。但是,由于属性往往是轻量级的,因此不应该是属性抛出异常的标准方案。同样,如果设置属性如此复杂或者属性的签名不允许调用者理解如何使用该属性(以便使用以异常结束),则方法可能是首选方法。
答案 1 :(得分:3)
Microsoft已针对Property Design发布了以下准则:
http://msdn.microsoft.com/en-us/library/ms229006.aspx
关于属性getter / setter异常:
√如果属性设置器抛出异常,请保留先前的值。
X AVOID从属性getter中抛出异常。 属性getter应该是简单的操作,不应该有任何先决条件。如果getter可以抛出异常,则应该将其重新设计为方法。请注意,此规则不适用于索引器,我们在此期间会通过验证参数来预期异常。
答案 2 :(得分:2)
如果您希望在setter中使用逻辑,则需要备份字段。否则,如果你试试
public int Number
{
set
{
Number = value;
}
}
在设置属性时会导致递归。至于第二个问题,抛出异常是好的,以防你的同事或该库的用户习惯于属性有时会替代方法的行为。就个人而言,我不这样做。如果属性设置失败,我通常会创建一个设置属性的方法,并用
标记它/// <exception cref=""></exception>