2012-09-03 159 views
0

如果我想在一个私有类中设置我的属性,所以它应该只能在这个类中使用和设置这个属性,有什么更好的方法?这财产:私人方法或私人获取/设置?

public string Name { private get; private set } 

private string Name { get; set } 

嗯并且还有

private string Name { private get; private set } 
+0

你要设置的属性类的私有变量? –

+0

@KundanSinghChouhan是的,我是这么认为的......不知道我得到它,你想^^ – silla

+0

@Sila我已经加了我的答案。看一看。 –

回答

5

你试过编译你的例子吗?只有中间的一个会翻译。

如果要指定额外的辅助功能级关键字,则只能在其中一个访问器(getter/setter)上执行此操作,并且该访问器的该级别必须比整个属性的可访问性更具限制性。

在这里,你看到的规则:Restricting Accessor Accessibility

+0

是的,你是对的。不知何故,我不能编译,如果使用私人获得;私人设置只有当我使用私人获得或设置 – silla

+0

@silla这是因为你设置属性与一个访问修饰符,同时设置所有可能的访问器与另一个。使用get和set private将其设置为公共部分否定公共部分,所以它不会编译。如果你把它设置为私有,获取和设置是自动私有的,因此没有必要将它们设置.... –

0

更好的方法取决于你想要什么:

public string Name { private get; private set }该物业是public没有人可以阅读或写信给它,除了课堂本身。那完全没用,所以只用 private string Name { get; set }

一般来说,如果你查看像情侣的方法(这实际上是)该财产

private string get_Name() { } 

private string set_Name(value) { } 

具有以应用标识符属性get/set变得明显,我希望有可能的原因。

+0

@downvoter:谨慎解释? – Tigran

+0

仅供参考,我不是downvoter。我想你的意思是'私人无效set_Name(字符串值){}'。 –

+0

'public string Name {private get;私人设置; }'不会编译'无法为属​​性或索引器'Program.Name''的访问器指定可访问性修饰符' – Alex78191

1
public string Name { get; private set; } 

这是我认为你想要做的。

除非你只想让你的班级看到它,否则在财产公开的时候试图让私人获得私密是没有意义的。在这种情况下,你应该使用:

private string Name { get; set; } 

更新:在二读,你一定要在第二个例子。

12

值得一提的是原本,C#不会让你设置一个getter或setter不同的接入,所以唯一可能的选择是:

public string Name { get; set; } 
protected internal string Name { get; set; } 
internal string Name { get; set; } 
protected string Name { get; set; } 
private string Name { get; set; } 

(就此而言,你不能拥有自动属性,并且总是必须自己写一个支持字段,但是我们会忽略它,仅仅因为我们会用这种方式来缩短范例)。

这是有不同的接入两个,最常见的是更严格的setter比吸气经常有用的。因此,

public string Name { get; private set; } 

喜欢被引入。现在

,通过该扩展,这似乎合乎逻辑,足以让:

public string Name { private get; private set; } 
private string Name { private get; private set; } 

然而,这两个是表达?

第二个是不是太糟糕了,这只是无谓地重复。尽管如此,很可能一些混淆的想法让我们在那里(很可能是不完整的重构)。好的代码和表达你在做计算机做什么(如果有的话,更是如此)所做的一样,更好地表达清楚。

因此,如果你最终得到{ private get; private set; }这样的结果,那么它很可能是值得再次考虑并思考你真正想在这里说些什么的。华友世纪因为它是一个编译器错误。

钍第一种情况更是雪上加霜。它说:“这个属性是公开的,除了私有的setter和私有的getter。”这不是一个例外,“这是一件事,除了所有的时间”都不是真正的表达。双倍支持编译器不让我们这样做。

+0

只要是迂腐:如果不指定一个getter或setter不同的访问权限,有五分之一的可能性:'保护内部字符串名称{get;组; }' –

+0

@JeppeStigNielsen是的。我认为'受到保护的内部'的一半概念并不在C#1.0中,后来才出现,但是快速搜索似乎表明它始终存在。 –

+0

'内部'现在意外''私人'。 –

0

如果你真的想你的要求,那么你并不需要的属性,你应该使用private场。

0

对于私有成员,你并不需要定义存取。 只是这样做:

private string _name;