阻止访问私有成员变量? 强制使用公共财产?

我使用的是.NET 2.0,因此无法访问自动属性。 所以我必须采用以下方式编写私有变量和公共属性

private string m_hello = null; public string Hello { get{return m_hello;} set{m_hello = value;} } 

对于上述私有/公共成员的包含类的方法,是否仍然限制对私有变量的访问? 我不喜欢我可以使用m_hello或Hello。

谢谢。

没有办法做到这一点,除了简单地遵循你自己的约定并做到这一点。你好,如果你真的需要通过你的公共财产。

我不明白为什么你需要/想要这样做,因为它是你的内部类,你是控制代码的人,你可以定义它的使用方式,所以不应该一个问题。

正如其他人所说,这应该是一个答案……

在针对.NET 2.0时,您仍然可以在C#3中使用自动属性,以及其他一些C#3function 。 与(比较)表达式树不同,除了[CompilerGenerated]属性(在.NET 2.0中引入)之外,自动属性不需要CLR或框架中的任何特殊内容。

因此,如果您使用的是VS2008或VS2010,那么使用自动属性是值得的。

虽然它值得,但我也喜欢这种能力。 我希望能够在属性中定义变量:

  public string Name { private string name; get { return name; } set { name = value; } } 

我认为这有点像私有变量readonly – 它对客户端没有区别,但它有助于在类代码本身内强制执行。

您可以通过inheritance来完成此任务:

 abstract class A // A is not instantiatable due to being abstract { private string m_hello = null; public string Hello { get{return m_hello;} set{m_hello = value;} } } class B : A { // B now cannot access the private variable, use B in your code instead of A } 

我并不是说这很好。 只是它可以做到。

不。该类中的任何方法都可以访问这两种方法。

您的团队应该标准化使用哪个(属性或私有变量)。

一旦确定要使用哪个,就可以尝试使用自定义FxCop规则来强制执行标准。

不,基本上。 那么,您可以通过[Obsolete]#pragma对编译器警告执行某些操作,但这样做会过多。

你可以用工具来做,但最终你需要相信人们不要做蠢事。 毕竟,你有特殊的规则:

 while(true) { } 

或者你只是把它归结为“不要愚蠢”? ,p

您应该只通过公共Hello属性访问该属性。 这就是这种模式的原因。 如果向get或set添加任何function,如果要访问私有实例,则会在代码中引入错误。 但是答案是否定的,当你在class里改变你的代码时,你不能阻止有人打电话给私人。

就个人而言,我认为访问class级中的私人成员并没有错。 事实上,这就是我通常所做的事情(除非我总是希望利用属性getter / setter中的逻辑)。

它对我来说很有意义:类中的代码构成了该类的实现; 为什么要隐藏一个实现呢?

这是我的意思的一个例子。 假设我有一些成员, m_denominator ,我希望它永远不会为零:

 private int m_denominator = 1; public int Denominator { get { return m_denominator; } set { if (value == 0) throw new ArgumentException("Denominator must not be zero."); m_denominator = value; } } 

我可能会对自己说:“好吧,无论我在这个类中设置这个值,我都应该使用Denominator来确保我没有将它设置为零。” 但是我完全掌控着我正在设置的Denominator – 我在课堂上!这种情况下, Denominator属性中的逻辑点是保护类免受客户端代码设置的无效值的影响。 在类本身的实现中,没有理由将内部状态设置为某个无效值。

当然,这不是绝对的规则。 肯定有时候在一个class级中使用该属性作为其逻辑可能是一个明智的选择作为保护措施; 实际上,我只是在争论从一个类中访问私有成员并没有错

如果你发现自己想要隐藏自己的细节,那可能是你的class级承担太多责任的代码味道。 考虑将一个职责提取到一个新类中。