假设我有class Foo
和
class FooFrobber
{
private Foo _foo;
FooFrobber(Foo foo)
{
_foo = foo;
}
Frob()
{
_foo.FrobCount += 1;
}
}
似乎_foo
是private
字段的好名称,但如果我想将其设为internal
或protected
变量,该怎么办?约定(http://weblogs.asp.net/lhunt/archive/2004/08/17/CSharpCodingStandardsv113.aspx via Style guide for c#?)似乎是使用没有m_或尾随_的StudlyCaps,这意味着我将声明protected Foo Foo
。这似乎有效,但是隐藏一个类名似乎有点奇怪。样式指南说所有字段都应该是私有的,但这似乎有点过分(但也许这是我内心的python说话)。无论如何,如果我们想在一个属性中包装_foo,你似乎会遇到同样的问题。
我是否应该总是为该字段提供不同的名称,如在MyFoo中?是否可以保留原样,因为编译器似乎并不介意?
答案 0 :(得分:2)
允许和通常的做法是使字段/属性与其类型具有相同的名称。从FCL中想到的第一个示例是DispatcherObject.Dispatcher
,它返回Dispatcher
类型的实例。
但是,我个人更喜欢避免将字段声明为受保护字段,而是使用属性。如果您想避免声明支持字段所涉及的编码,您可以使用自动实现的属性:
protected Foo Foo { get; set; }
使用属性的优点是可以为getter和setter应用不同的访问修饰符:
protected Foo Foo { get; private set; }
编辑:使用受保护属性而不是受保护字段的优点是,它们允许您更改其实现 - 例如,引入值验证或更改通知 - 而不会破坏可能访问的外部库它
例如,假设您要扩展您的类以实现INotifyPropertyChanged
。如果您使用受保护的字段,则没有直接的方法来检测消耗组件何时更改字段的值(除非您也更改外部程序集的实现)。如果您使用受保护的属性,则只需更改其实现,而无需对使用程序集进行任何更改:
private Foo foo;
protected Foo Foo
{
get
{
return foo;
}
set
{
if (foo != value)
{
foo = value;
OnPropertyChanged("Foo");
}
}
}
编辑 2 :在LBushkin’s answer中提供了在字段上使用属性的其他几个优点。
将字段更改为属性确实会破坏ABI。我还没有在权威来源中找到它(我没有花太多时间看);但是,按pst’s comment:
可以更改属性背后的代码(使用自定义私有支持字段或其他)。但是,将公共成员变量更改为属性是ABI(应用程序二进制接口)中的重大变化。
首先要记住的是,属性访问器被编译为方法。这意味着它具有与读/写类成员变量不同的ABI,即使它在语法上看起来可能相同。
答案 1 :(得分:1)
这是一种常见做法,主要来自C++
世界,用于在前面命名_
字段。
这样的命名转换绝对可以,直到它们符合开发组的要求。
在理想世界中,或者说(或者说)在尽可能多地命名变量时要遵循的方向,不要在其名称中突出显示变量的type
,但它在此程序中代表含义。
所以没有(说)
string sName
,拥有string userName
而不是Robot robot
,拥有Robot conveyor
,依此类推......
希望这有帮助。
答案 2 :(得分:0)
我认为保持原样是绝对可以的。编译器能够判断您的代码是否引用了类或属性,以及为什么在类名称足够表达时引入另一个术语。