当前位置: 首页 > 编程语言 > C#

嵌套枚举和属性命名冲突分享

时间:2023-04-10 15:16:50 C#

嵌套枚举和属性命名冲突这里和这里也有一些相关的问题,但都没有真正给我满意的答案。问题是嵌套在C#中的类的枚举不能与该类的属性同名。我的例子:publicclassCard{publicenumSuit{Clubs,Diamonds,Spades,Hearts}publicenumRank{Two,Three,...King,Ace}publicSuitSuit{get;私有集;}publicRankRank{get;私有集;}...}有一些选项可以解决这个问题,但它们对我来说似乎不合适。我可以将枚举移到课堂之外,但你只说Suit而不是Card.Suit,这对我来说似乎不对。什么是卡片上下文之外的花色?我可以将它们移出类并将它们更改为CardSuit和CardRank之类的东西,但是当它应该由类或命名空间名称处理时,我觉得我正在将上下文信息烘焙到枚举的名称中。我可以将枚举的名称更改为SuitsandRanks,但这违反了Microsoft的命名准则。只是感觉不对。我可以更改属性名称。但是什么?想说Suit=Card.Suit.Spades对我来说直觉上是对的。我可以将枚举移动到一个名为CardInfo的单独静态类中,其中包含这些枚举。如果我想不出别的办法,我认为这是最好的选择。所以我想知道其他人在类似情况下做了什么。也很高兴知道为什么不允许这样做。也许EricLippert或其他人可能会决定禁止它?它似乎只会在类中造成歧义,这可以通过强制使用this.Suit作为属性名称来解决。(类似于消除本地人和成员之间的歧义。)我认为由于“每个特征都以-100点开始”的事情而被遗漏了,但我对围绕它的讨论很好奇。也很高兴知道为什么不允许这样做。也许EricLippert或其他人可能会决定禁止它?该规则的要点是确保在查找名称时类中没有歧义。某些代码区域被指定为定义“声明空间”。声明空间的基本规则是,在同一声明空间中声明的两个事物不具有相同的名称(方法除外,必须通过它们的签名而不是它们的名称来区分。)对这条规则做出例外只会使事情更加混乱,不会混淆人们。我同意您不能在同一声明空间中声明具有相同名称的属性和枚举,但是一旦您开始创建异常,它就会变得一团糟。它通常是一个很好的属性,名称可以唯一标识方法组、类型参数、属性等。请注意,此规则适用于声明空间内声明的内容,而不适用于声明空间内使用的内容。如果类型Suit没有在与属性相同的声明空间中声明,那么说“publicSuitSuit{get;set;}”是完全合法的。当有人说“Suit.X”时,弄清楚X是按类型(即X是静态成员)还是属性(即X是实例成员)有点棘手。有关详细信息,请参阅我的文章:http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx我更喜欢使用名词后跟选项来命名枚举。在你的情况下:SuitOptionsRankOptions毕竟,枚举只是一组可能的选择,对吧?你会有:myCard.Suit=Card.SuitOptions.Clubs;在我看来这是有道理的,在查看文本时您仍然能够判断它是枚举还是属性。我同意将枚举定义移到一个单独的地方。目前,枚举只能被卡片看到,所以如果你想检查一个ace,你必须这样做将它移到一个单独的定义中,如果你让它成为全局的,你可以这样做:if(card.Suit==Suit.Ace){}//没有命名冲突,更容易阅读命名空间以表明它们与卡片有关。我通常不喜欢嵌套在类中的枚举。不过,您对数字的看法是正确的:常规枚举为单数,标志枚举为复数。您的枚举基本上是您定义的数据类型。您不使用“int”或“string”作为成员名称,因此我认为在您的案例中使用枚举名称和成员名称同样是个坏主意。有趣的是,虽然Microsoft命名指南说您应该为大多数枚举使用单数名称,为位字段使用复数名称,但enum关键字的代码示例使用复数名称!枚举天数{星期日、星期一、星期二、星期三、星期四、星期五、星期六};将枚举包装在结构中非常适合我的特殊情况b/c有其他数据在起作用(intValue,这也是一种值类型)。publicclassRecord{publicenumDurationUnit{Minutes,Hours}publicstructDurationStruct{publicreadonlyintValue;公共只读DurationUnit单位;publicDurationStruct(intvalue,DurationUnitunit){Value=value;单位=单位;}}公共DurationStruct持续时间;//{得到;set;}-不能将ref返回给val类型(在C#中)publicvoidInit(){//初始化结构(不是像ref类型那样真正的“新”)//-如果DurationStruct已经毕业/上升,则有帮助的语法上课Duration=newDurationStruct(1,DurationUnit.Hours);那么对于上面的Card类,大概是下面这样的全部内容,如果对你有用,需要了解更多的C#学习教程,希望大家多多关注——publicclassCard{publicenumSuit{Clubs,Diamonds,Spades,Hearts}publicenumRank{二,三,..King,Ace}publicstructCardStruct{publicCard.SuitSuit{get;私有集;}publicCard.RankRank{get;私有集;}}//publicCardStructCard{get;set;}-不能与封闭类相同publicCardStruct身份{get;set;}publicintValue{get{//switch((Suit)Card.Suit)switch((Suit)Identity.Suit){//caseSuit.Hearts:returnCard.Rank+0*14;caseSuit.Hearts:returnIdentity.Rank+0*14;caseSuit.Clubs:returnIdentity.Rank+1*14;caseSuit.Diamonds:returnIdentity.Rank+2*14;.等级+3*14;}}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: