Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 阻止访问私有成员变量?强制使用公共财产?_C#_Oop - Fatal编程技术网

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

C# 阻止访问私有成员变量?强制使用公共财产?,c#,oop,C#,Oop,我使用的是.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,因此无法访问自动属性。因此,我必须采用以下方法对私有变量和公共属性进行编码

private string m_hello = null;

public string Hello
{
     get{return m_hello;}
     set{m_hello = value;}
}
对于包含上述私有/公共成员类的方法,是否仍有限制对私有变量的访问?我不喜欢我可以用m_hello或hello


谢谢。

不,除了按照自己的习惯去做之外,没有其他方法可以做到这一点。如果你真的需要检查你的公共财产,您好

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

基本上没有。嗯,您可以通过
[过时]
#pragma
对编译器警告进行处理,但这太过分了

您可能可以使用工具来完成,但最终您需要相信人们不会做愚蠢的事情。毕竟,您是否有关于以下方面的特殊规定:

while(true) { }

或者你只是说“别傻了”;p

否。类中的任何方法都可以同时访问这两种方法

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


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

您应该只通过公共Hello属性访问该属性。这就是这种模式的原因。如果向get或set添加任何功能,如果访问私有实例,就会在代码中引入bug。但是答案是否定的,当有人在你的类中更改你的代码时,你不能阻止他们调用Private

就我个人而言,我认为访问类中的私有成员没有错。事实上,我通常就是这么做的(除非在属性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;
    }
}
我可能会对自己说:“好的,在这个类中,无论我在哪里设置这个值,我都应该使用
分母
,以确保我没有将它设置为零。”但是我完全可以控制我设置的
分母
——我在类中
在此场景中,
分母
属性中的逻辑要点是保护类不受客户端代码设置的无效值的影响。在类本身的实现中,没有理由将内部状态设置为某个无效值


当然,这不是绝对的规则。在某些情况下,将属性用于类内的逻辑可能是一种明智的选择,作为一种保护措施;真的,我只是认为从类内访问私有成员是正确的。

您可以通过继承来实现这一点:

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
}

我并不是说这是好的。这是可以做到的

如果您发现自己想要对自己隐藏细节,那么这可能是一种代码味道,说明您的类有太多的责任。考虑把其中一个责任提取到一个新类中。

,正如其他人建议的那样,这应该是一个答案…… 当您将.NET2.0作为目标时,您仍然可以在C#3中使用自动属性,以及。与(比如)表达式树不同,除了
[CompilerGenerated]
属性(在.NET 2.0中引入)之外,自动属性不需要CLR或框架中的任何特殊内容

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

不管它值多少钱,我也喜欢这个能力。我希望能够在属性中定义变量的范围:

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

我认为这有点像将私有变量设置为只读—它对客户端没有影响,但有助于在类代码本身中强制执行正确性。

Woah!抱歉@Mitchel-我不小心编辑了错误的帖子。对不起。@Marc-你被可爱的随机排序功能咬了吗?我已经不止一次地遇到这种情况,在编辑(或提交)后,我自动假设我的问题处于相同的位置,然后盲目地点击编辑按钮。当这个位置的答案以几乎相同的文本开头时,没有任何帮助。需要注意的是,即使您的目标是.NET 2.0,如果您使用C#3,您仍然可以使用自动属性。它们不需要任何框架支持。@Jon——这可能是足够重要的信息,足以保证回答而不是评论。@tvanfosson——我同意,对此一无所知!不太相关,但我很惊讶人们仍然使用“m_”。它不仅被建议反对(我个人更喜欢用一个前导“u”来表示私有变量),它也很难看,尽管这可能是个人观点。这里有一篇关于.NET命名约定和编程标准的文章:我在这里问了一个类似的问题:那么,当您在6个月后回到代码中为属性设置器添加重要逻辑时,会发生什么?您的类的所有内部代码现在都将绕过新的实现。我宁愿默认使用该属性,因为我不想跟踪该属性执行特殊操作的位置。优化器通常会负责优化方法调用,至少对于简单的访问器是这样。只有当我知道属性做了一些“特殊”的事情时,我才会使用该属性,我想出于某些特殊目的避免使用它。@Herbie博士:但根据我的经验,您很可能会向属性添加逻辑,但不希望在类内发生的每次访问上都执行该逻辑——只在从外部代码进行的访问上执行。我已经确定了