拥有与班级同名的成员是不好的风格?

时间:2012-06-05 18:34:47

标签: c# .net coding-style

假设我有class Foo

class FooFrobber
{
   private Foo _foo;

   FooFrobber(Foo foo)
   {
       _foo = foo;
   }

   Frob()
   {
      _foo.FrobCount += 1;
   }
}

似乎_fooprivate字段的好名称,但如果我想将其设为internalprotected变量,该怎么办?约定(http://weblogs.asp.net/lhunt/archive/2004/08/17/CSharpCodingStandardsv113.aspx via Style guide for c#?)似乎是使用没有m_或尾随_的StudlyCaps,这意味着我将声明protected Foo Foo。这似乎有效,但是隐藏一个类名似乎有点奇怪。样式指南说所有字段都应该是私有的,但这似乎有点过分(但也许这是我内心的python说话)。无论如何,如果我们想在一个属性中包装_foo,你似乎会遇到同样的问题。

我是否应该总是为该字段提供不同的名称,如在MyFoo中?是否可以保留原样,因为编译器似乎并不介意?

3 个答案:

答案 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(应用程序二进制接口)中的重大变化。

jstedfast’s answer

  

首先要记住的是,属性访问器被编译为方法。这意味着它具有与读/写类成员变量不同的ABI,即使它在语法上看起来可能相同。

答案 1 :(得分:1)

这是一种常见做法,主要来自C++世界,用于在前面命名_字段。 这样的命名转换绝对可以,直到它们符合开发组的要求。

在理想世界中,或者说(或者说)在尽可能多地命名变量时要遵循的方向,不要在其名称中突出显示变量的type ,但它在此程序中代表含义

所以没有(说)

string sName,拥有string userName而不是Robot robot,拥有Robot conveyor,依此类推......

希望这有帮助。

答案 2 :(得分:0)

我认为保持原样是绝对可以的。编译器能够判断您的代码是否引用了类或属性,以及为什么在类名称足够表达时引入另一个术语。