2013-04-24 71 views
2

我有这样的代码:访问者为什么必须比属性限制更多?

public string foo { get; set; } 

现在,我解释这是我的对象有一个名为foo的公共属性,都它的访问是公开的。如果我这样写:

private string foo { get; set; } 

我解释说我的对象有一个名为foo私人财产,都它的访问者的是私有的。我明白将财产本身保密。我不明白的是为什么访问者必须更具限制性?如果我写:

private string foo { public get; public set; } 

我解释,我的对象有一个名为foo私人财产,双方是它的访问是公开的,这是我想要的行为。我希望拥有公共访问者的私人财产。我的意思是,如果我必须写一个Get/Set方法,我会的。但我只是困惑,为什么这是。

+0

怎么样,去年财产是私有?或者整个事情都是私密的,而且getter/setter实际上是私人的,即使你正在对他们的公共访问者进行拍打,或者它是公开的,并且'private'标识符不正确... – Servy 2013-04-24 20:32:26

+1

我认为这只是一个有用的惯例。为了代码一致性,关于访问级别的顺序应该遵循* some *规则(在类定义中,'static'应该出现在'partial'之前的规则应遵循相同的方式),并且它使得意识到规则应该是“属性访问级别必须限制最少”,因为眼睛首先倾向于关键字,这是最安全的选择。 – 2013-04-24 20:36:08

+2

我向SO道歉。这个问题是由于我对非常非常基本的东西的无知:[字段和属性之间的区别](http://stackoverflow.com/questions/295104/what-is-the-difference-between-a-field -and-A-属性功能于c)中。现在我已经看到了这一点,现在更清晰了。 – MyCodeSucks 2013-04-24 20:42:22

回答

3

的属性实际上是(水下)不外乎两种方式:

public string foo { get; set; } 

将转化为:

public string get_foo() { ... } 
public void set_foo(string value) { ... } 

这些方法只能有一个访问修饰符,而不是两个的组合。

如果我记得正确,C#v1不支持getter和setter的访问修饰符。有两个函数使用了一个访问修改器。

在v2中,可以“覆盖”getter/setter对之一,这样就可以覆盖“other”函数。没有必要重写这两个getter/setter,因为在那里会导致property-access修饰符无用。

为什么getter/setter的访问修饰符更具限制性,在我看来,这与更容易实现总是具有(隐式公共)属性的接口有关。

欲了解更多信息,请阅读:http://msdn.microsoft.com/en-us/library/75e8y5dd(v=vs.80).aspx

0

为什么需要这样的属性

private string foo { public get; public set; } 

如果你想拥有你得到公共设置,然后进行财产公开。

编译器将首先检查属性的访问权限,然后检查其方法。如果属性是公共的,然后它的方法可以有公共或私人或任何访问

相关问题