拥有与类同名的成员是否风格不好
本文关键字:是否 风格 成员 拥有 | 更新日期: 2023-09-27 18:36:23
假设我有class Foo
和
class FooFrobber
{
private Foo _foo;
FooFrobber(Foo foo)
{
_foo = foo;
}
Frob()
{
_foo.FrobCount += 1;
}
}
似乎_foo
是private
字段的好名称,但是如果我想使其成为internal
或protected
变量怎么办? 约定(通过 c# 的样式指南 http://weblogs.asp.net/lhunt/archive/2004/08/17/CSharpCodingStandardsv113.aspx?)似乎是使用没有m_或尾随 _ 的 StudlyCaps,这意味着我将声明protected Foo Foo
。 这似乎有效,但隐藏类名似乎有点奇怪。 风格指南说所有字段都应该是私有的,但这似乎有点过分(但也许这是我内心的 python 说话)。 无论如何,如果我们想将_foo包装在属性中,您似乎会遇到同样的问题。
我是否应该总是为该领域想出一个不同的名称,就像在MyFoo中一样? 是否可以保持原样,因为编译器似乎并不介意?
具有与其类型共享相同名称的字段/属性。从 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的回答中给出了使用属性而不是字段的更多优点。
将字段更改为属性似乎确实会破坏 ABI。我还没有在权威来源中找到它的说法(我没有花太多时间看);但是,根据PST的评论:
可以更改属性背后的代码(以使用自定义私有支持字段或其他任何内容)。但是,将公共成员变量更改为属性是 ABI(应用程序二进制接口)中的重大更改。
根据jstedfast的回答:
首先要记住的是,属性访问器被编译为方法。这意味着它具有与仅读取/写入类成员变量不同的 ABI,即使它在语法上看起来相同。
常见的做法,主要来自C++
世界,命名前面有_
的字段。像这样的命名转换是绝对可以的,直到它们符合开发组的要求。
在理想世界中,或者(说)尽可能多地命名变量所遵循的方向是不在其名称中突出显示变量的type
,而是它在此程序中表示的含义。
所以而不是有(说)
string sName
,有一个string userName
,而不是Robot robot
,有Robot conveyor
,等等......
希望这有帮助。
原样是绝对可以的。编译器能够判断您的代码是引用类还是属性,以及如果类名足够富有表现力,为什么要引入另一个术语。