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

时间:2010-07-16 14:03:35

标签: c# oop

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

private string m_hello = null;

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

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

感谢。

8 个答案:

答案 0 :(得分:11)

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

在定位.NET 2.0时,您仍然可以使用C#3中的自动属性以及quite a few other C# 3 features。与(比较)表达式树不同,自动属性不需要CLR或框架中的任何特殊内容,超出[CompilerGenerated]属性(在.NET 2.0中引入)。

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

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

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

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

答案 1 :(得分:8)

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

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
}

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:4)

没有。类中的任何方法都可以访问它们。

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

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

答案 4 :(得分:1)

不,基本上。好吧,你可以通过[Obsolete]#pragma对编译器警告做些什么,但这样做会过多。

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

while(true) { }

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

就个人而言,我认为访问班级中的私人会员并没有错。事实上,这就是我通常所做的事情(除非我总是想要利用属性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属性中的逻辑是保护类免受客户端代码设置的无效值的影响。在类本身的实现中,没有理由将内部状态设置为某个无效值。

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

答案 7 :(得分:0)

如果您发现自己想要隐藏自己的详细信息,那可能是您的班级承担过多责任的代码味道。考虑将其中一个职责提取到一个新班级。