编程语言
首页 > 编程语言> > c#-具有与类同名的成员是否不好?

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).

根据jstedfast’s answer

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