我正在使用.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。
谢谢。
正如其他人所建议的,这应该是一个答案...
即使针对.NET 2.0,您仍然可以在C# 3中使用自动属性,以及相当多其他C# 3功能。与(例如)表达式树不同,自动属性除了[CompilerGenerated]
属性(在.NET 2.0中引入)之外,不需要来自CLR或框架的特殊内容。
因此,如果您使用的是VS2008或VS2010,则值得使用自动属性。
但值得一提的是,我也想要这个能力。 我希望能够在属性内部限定变量的范围:
public string Name
{
private string name;
get { return name; }
set { name = value; }
}
我认为这有点像将私有变量设置为只读 - 对客户端没有影响,但有助于在类代码内部执行正确性检查。
readonly
字段支持。 - Jesse C. Slicerabstract 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
while(true)
加上循环体内的 break
是一个非常合法的编程结构。比那更糟糕的事情还有很多。 - ToxicAvengerbreak
? - Marc Gravell就我个人而言,我认为在类内部访问私有成员没有任何问题。事实上,这是我通常的做法(除非属性的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;
}
}
我可能会对自己说:“好的,在这个类中,无论我在哪里设置这个值,我都应该使用分母
来确保我没有将其设置为零。” 但是我完全控制着我要将分母
设置为什么——我在类内部! 在这种情况下,分母
属性的逻辑点是保护类免受客户端代码设置的无效值。在类本身的实现中将内部状态设置为某些无效值是没有任何借口的。
当然,这不是绝对的规则。当在类中使用属性进行逻辑处理作为一种保护措施时,这可能是明智的选择;实际上,我只是认为从类内部访问私有成员并不是错误的。
我相信在 C#10
,或者至少有一个提议能使用半自动属性。
现在我们可以使用field
关键字代替后备属性字段。
所以这个:
private int _theNumber;
public int TheNumber
{
get => _theNumber;
set => _theNumber = value;
}
变成这样:
public int TheNumber
{
get => field;
set => field = value;
}
在我提供的例子中,自动属性可能更有意义,但我想展示一个简单的例子。