c#-具有与类同名的成员是否不好?
作者:互联网
假设我上了Foo课,
class FooFrobber
{
private Foo _foo;
FooFrobber(Foo foo)
{
_foo = foo;
}
Frob()
{
_foo.FrobCount += 1;
}
}
似乎_foo是私有字段的好名字,但是如果我想使其成为内部变量或受保护的变量该怎么办?惯例(http://weblogs.asp.net/lhunt/archive/2004/08/17/CSharpCodingStandardsv113.aspx通过Style guide for c#?)似乎是使用没有m_或尾随_的StudlyCaps,这意味着我将声明受保护的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");
}
}
}
Edit2:在LBushkin’s answer中给出了在字段上使用属性的更多优点.
将字段更改为属性似乎会破坏ABI.我尚未在权威消息中找到它(我没有花太多时间在看);但是,根据pst’s comment:
The code behind the property can be changed (to use a custom private backing field or whatever). However, changing a Public Member Variable to a Property is a breaking change in the ABI (Application Binary Interface).
First thing to keep in mind is that property accessors are compiled into methods. This means that it has a different ABI from just reading/writing to a class member variable, even though it may syntactically look the same.
标签:coding-style,c,net 来源: https://codeday.me/bug/20191201/2079337.html