嵌套枚举和属性命名冲突

Sea*_*lin 29 .net c# enums

这里这里有一些相关的问题,但它们并没有真正给我满意的答案.问题是嵌套在C#中的类的枚举不能与类的属性具有相同的名称.我的例子:

public class Card
{
    public enum Suit
    {
        Clubs,
        Diamonds,
        Spades,
        Hearts
    }

    public enum Rank
    {
        Two,
        Three,
        ...
        King,
        Ace
    }

    public Suit Suit { get; private set; }
    public Rank Rank { get; private set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

有一些选项可以解决这个问题,但它们对我来说似乎并不合适.

我可以在课堂外移动枚举,但是你只会说Suit而不是Card.Suit,这对我来说似乎不对.什么是Suit外界的背景Card

我可以移动它们的类外,并将其更改为类似CardSuitCardRank,但后来我觉得我在烤的上下文信息到枚举时,应该由一个类或命名空间名称进行处理的名称.

我可以改变枚举到的名字SuitsRanks,但是这违反了微软的命名规则.它感觉不对劲.

我可以更改属性名称.但到了什么?我觉得直觉对我来说是对的Suit = Card.Suit.Spades.

我可以将枚举移动到一个单独的静态类中,该类CardInfo只包含这些枚举.如果我不能提出任何其他建议,我认为这是最好的选择.

所以我想知道其他人在类似的情况下做了什么.知道为什么不允许这样做也很好.也许埃里克·利珀特(Eric Lippert)或其他人可能会决定禁止它?它似乎只会类中产生歧义,这可以通过强制使用this.Suit属性名来解决.(类似于消除当地人和成员之间的歧义.)我认为这是由于"每个功能以-100点开始"的事情而被遗漏,但我会对围绕此问题的讨论感到好奇.

Eri*_*ert 19

知道为什么不允许这样做也很好.也许埃里克·利珀特(Eric Lippert)或其他人可能会决定禁止它?

规则的要点是确保在查找名称时类中没有歧义.某些代码区域被指定为定义"声明空间".声明空间的基本规则是在同一声明空间中声明的两个事物具有相同的名称(方法除外,它们必须通过签名而不是名称区分.)

对此规则进行例外处理只会让事情变得更加混乱,而不会让人感到困惑.我同意你不能在同一个声明空间中声明一个属性和一个同名的枚举,但是一旦你开始制作异常,它就会变得一团糟.它通常是一个很好的属性,名称唯一标识方法组,类型参数,属性等.

请注意,此规则适用于事物宣布的声明空间,没有东西在声明空间.如果类型Suit未在与属性相同的声明空间中声明,则说"public Suit Suit {get; set;}"是完全合法的.当有人说"Suit.X"时,弄清楚X是否在类型上(即X是静态成员)或属性(即X是实例成员)有点棘手.有关详细信息,请参阅我的文章:

http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx


Vic*_*aci 5

我更喜欢使用名词后跟选项来命名枚举。在你的情况下:

SuitOptions
RankOptions
Run Code Online (Sandbox Code Playgroud)

毕竟,枚举只是一组可能的选项,对吧?

然后你将拥有:

myCard.Suit = Card.SuitOptions.Clubs;
Run Code Online (Sandbox Code Playgroud)

在我看来,这是有道理的,您在查看文本时仍然能够知道是枚举还是属性。

  • 需要注意的是,仅当它是一个标志枚举时才使用复数 SuitOptions,根据开发 .NET 框架的人的说法,常规枚举应该是单数 SuitOption(尽管他们承认有时会弄乱并发布违反规定的内容,因此如果你找到一个反例)。有时我也会这样做,但更喜欢后缀“类型”(但我也考虑过“代码”)。在数据库世界中,我经常遇到同样的问题,因为我经常有一个大的 Roles 表和一个 RoleTypes 代码表(通常分别映射到 C# 中的类和枚举)。 (5认同)
  • 由于枚举根据定义是一组选项,因此将其添加到名称中似乎是多余的。这似乎相当于添加一个 -Enum 后缀,但风格指南规定不要这样做。 (4认同)
  • 您认为是否有任何枚举 -Options 是不合适的后缀?我想不出它有什么不适合的地方,我认为这就是问题所在——它太笼统了。就像类上的 -Manager 或 -Helper 一样。 (2认同)