拥有与类同名的成员是否风格不好

本文关键字:是否 风格 成员 拥有 | 更新日期: 2023-09-27 18:36:23

假设我有class Foo

class FooFrobber
{
   private Foo _foo;
   FooFrobber(Foo foo)
   {
       _foo = foo;
   }
   Frob()
   {
      _foo.FrobCount += 1;
   }
}

似乎_fooprivate字段的好名称,但是如果我想使其成为internalprotected变量怎么办? 约定(通过 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,等等......

希望这有帮助。

我认为保持

原样是绝对可以的。编译器能够判断您的代码是引用类还是属性,以及如果类名足够富有表现力,为什么要引入另一个术语。