C# 阻止访问私有成员变量?强制使用公共财产?
我使用的是.NET 2.0,因此无法访问自动属性。因此,我必须采用以下方法对私有变量和公共属性进行编码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 谢谢。不,除了按照自己的习惯去做之外,没有其他方法可以做到这一点。
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博士:但根据我的经验,您很可能会向属性添加逻辑,但不希望在类内发生的每次访问上都执行该逻辑——只在从外部代码进行的访问上执行。我已经确定了