2009-01-09 108 views
2

我注意到有些人声明一个私有变量,然后一个公共变量与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

“是不是在使用公共变量时有效,您可以使用变量的get方法设置任何时间” - 您不能从getter中设置var,只能设置setter。 – 2009-01-09 06:16:09

+0

呃,你是对的...错字。需要更多的睡眠或咖啡因... – Dscoduc 2009-01-09 07:07:40

+1

第二个例子仍然不会编译 - 您没有“值”变量,并且setter仍然是递归的。第一个和第二个例子之间有什么不同? – 2009-01-09 07:27:33

回答

1

This是对这个话题的一个非常有趣的阅读。但是,我非常确定我已经阅读了MSDN上的某个地方,使用公共变量的对象比属性更轻(找不到链接)。

19

你的第二个例子不会编译,因为getter的值变量不存在。另外,setter会导致同名的StackOverflow异常!

在C#3.0中,可以使用下面的语法可以让编译器创建私有变量后盾:

public string MyVariable { get; set; } 

这不会给你额外的空检查你的第一个例子了,虽然。如果您需要定制器中的自定义逻辑,您可能必须坚持使用第一个示例的方法。

+4

+1对于任何正确使用单词同名的答案:) – 2009-01-09 06:21:30

+2

我以为他应该得到点使用StackOverflow在本网站的名称以外的东西...... ;-) – Dscoduc 2009-01-09 06:31:30

6

正如其他人所说,你的第二个例子不编译。

但是,不使用公共领域有很好的理由。事实上,你的例子演示了其中的一个 - 对于这个属性,即使你将它设置为null,如果你再次要求它,你会得到一个空字符串。对于该房产是否合适(它是略微奇数)取决于确切的用途 - 但它不是公共领域的行为。

我有一个whole article关于为什么房产比公共领域,你会发现有用的。

-1

有一个微不足道的getter和setter与使用公共领域非常相似。

主要论据宁愿在使用是uniform access principle性能getter和setter方法,但由于C#具有的属性很容易用一个属性来取代公共领域,并重新编译。

这并不完美(见Jon Skeet的文章),但反对使用公共领域的论点并不那么强烈,只要你意识到差异,它就会变成“邪恶”。

个人而言,我喜欢能够轻松地为公共领域指定默认值。