我注意到有些人声明了一个私有变量,然后是一个带有get和set语句的公共变量:
private string myvariable = string.Empty;
public string MyVariable
{
get { return myvariable; }
set { myvariable = value ?? string.Empty; }
}
然后有些人会做以下事情:
public string MyVariable
{
get { return value; }
set { MyVariable = value; }
}
做一个没有智慧的熊(是的,我有孩子......你为什么问?)我无法弄清楚为什么你会选择一个而不是另一个。使用公共变量是否同样有效,您可以使用变量的set方法随时设置?
有人能为我解释一下吗?
更新:在几个人指出它无法编译之后,我更正了第二个例子。对此抱歉,但问题仍然存在......
答案 0 :(得分:19)
您的第二个示例将无法编译,因为getter的值变量不存在。此外,setter会导致同名的StackOverflow异常!
在C#3.0中,您可以使用以下语法让编译器创建私有后备变量:
public string MyVariable { get; set; }
但是,这不会给你第一个例子的额外空值检查。如果您需要在setter中使用自定义逻辑,则可能必须坚持使用第一个示例的方法。
答案 1 :(得分:6)
正如其他人所说,你的第二个例子没有编译。
但是,不使用公共领域有很好的理由。实际上,您的示例演示了其中一个 - 对于此属性,即使您将其设置为null,如果再次请求它,也会返回一个空字符串。是否适合该属性(它的略微奇数)取决于确切的用途 - 但这不是公共领域的行为。
我有一个whole article关于为什么属性比公共字段更好,你可能会发现它们很有用。
答案 2 :(得分:1)
This是关于这个主题的非常有趣的读物。但是,我很确定我已经在MSDN上的某处读过,公共变量的对象比具有属性的对象要轻(找不到链接)。
答案 3 :(得分:-1)
使用普通的getter和setter与使用公共字段非常相似。
优先选择使用属性的getter和setter的主要参数是uniform access principle,但由于C#具有属性,因此很容易用属性替换公共字段并重新编译。
这并不完美(参见Jon Skeet的文章),但是反对使用公共领域的论据不是那么强烈,只要你意识到差异就会使它变得“邪恶”。
就个人而言,我希望能够轻松指定公共字段的默认值。