是否建议在所有C#enum后面加上「;“枚举”;为了避免命名冲突?

是否建议在所有C#enum后面加上「;“枚举”;为了避免命名冲突?,c#,enums,naming-conventions,C#,Enums,Naming Conventions,对如何避免给枚举和属性赋予相同的名称进行了有趣的讨论,这样您就不会有这样的代码: public SaveStatus SaveStatus { get; set; } 似乎公认的答案建议对枚举使用“状态”,对属性使用“状态”: public SaveStatus SaveState { get; set; } 但我认为这很难理解,也不能马上弄清楚到底是什么 由于此枚举命名问题是一个经常出现的问题,我只考虑始终使用“enum”作为我的枚举的后缀,因此我会: public SaveStatusE

对如何避免给枚举和属性赋予相同的名称进行了有趣的讨论,这样您就不会有这样的代码:

public SaveStatus SaveStatus { get; set; }
似乎公认的答案建议对枚举使用“状态”,对属性使用“状态”:

public SaveStatus SaveState { get; set; }
但我认为这很难理解,也不能马上弄清楚到底是什么

由于此枚举命名问题是一个经常出现的问题,我只考虑始终使用“enum”作为我的枚举的后缀,因此我会:

public SaveStatusEnum SaveStatus { get; set; }

SaveStatus = SaveStatusEnum.Succeeded;

有人这样做吗?满意吗?用另一种方法解决了这个问题。

net Framework是否使用Enum作为后缀?这就是为什么我也不使用它

相反,我使用Option(或者Options,如果它是一个标志枚举)、Mode或类似的词

public SaveStatusMode SaveStatus { get; set; }
public SaveStatusOption SaveStatus { get; set; }
public SaveStatusVariant SaveStatus { get; set; }

微软的.NET命名指南没有给出任何这样的建议

为什么要避免为枚举和属性指定相同的名称?这:

public SaveStatus SaveStatus { get; set; }
工作正常,可读性强,可发现性和可用性强。

来自:

考虑创建一个与其基础属性同名的属性 类型。例如,如果声明名为Color的属性,则 属性也应该是颜色

我认为这是一个“不”:

编辑:

如果您不喜欢在声明属性的类中使用完全限定名,可以解决此问题:

using SaveStatusEnum = MyNamespace.SaveStatus;
...
SaveStatus = SaveStatusEnum.SomeValue;

这样,您就可以保留枚举名而不带后缀,并将命名奇怪之处仅限于该类。:)

一种后缀用于某些类型的类,如
xxxException
xxxAttribute
类,但后缀的使用并不广泛。例如,实现IEnumerable的类没有命名为
MyListEnumerableClass
,而是命名为
MyList


不要发明一个标准的后缀来把名字弄得乱七八糟,试着编一些在特定情况下有意义的名字。

如果以你拥有的方式定义属性,那么两个名字是否相同肯定没有什么区别。我想说,以这种方式使用可能更为清晰。

我知道我的建议违背了.NET命名约定,但我个人用“E”作为枚举的前缀,用“F”作为枚举标志的前缀(类似于我们用“I”作为接口的前缀)。我真的不明白为什么这不是惯例。枚举/标志是一种类似于特例的接口,永远不会更改其类型。它不仅明确了它是什么,而且很容易在intellisense中键入,因为前缀将过滤大多数其他类型/变量/等等,并且不会出现这些命名冲突


这还可以解决另一个问题,例如WPF中的示例使用静态类,如Enum(例如FontWeights),这些类具有预定义的类型实例,但如果不搜索它,您将不知道。如果它们只是在前缀中加上“E”,那么您所要做的就是键入字符来查找这些特殊的静态类。

我推荐MS指南。而且在代码中读取类似“FooEnum”的内容总是很糟糕;)

在DOTNET中开发mside的要点之一是消除这样的问题。我甚至会说IDE是DOTNET不可分割的一部分。我这样做了,我对此感到高兴。我曾经避免使用它,但它在实际代码中给我带来了问题。当您查看一行代码时,使用SaveStatus SaveStatus{get;set;}似乎是合理的。当你在一个有数百行代码的类中,而resharper总是混淆这两行代码时,这是令人恼火和困惑的。是的,但这是resharper错误,而不是Visual Studio或编译器问题。告诉ReSharper团队修复他们的bug。但是在我的构造函数中,我必须有一个巨大的名称空间限定符:SaveStatus=TestingDelegateCommandSave.ViewModels.SaveStatus.notapplicate;否则intellisense认为我的意思是“保存状态”属性。我在我的类文件中定义了枚举,因为它只用于我的类,因此命名与属性冲突,这就是为什么我要寻找另一种命名枚举的约定来避免这种情况。我一直使用SaveStatus SaveStatus。由于一是一个属性,我认为它比将名称更改为SaveState更具可读性。爱德华:不,你不需要名称空间限定符,至少在C#中不需要。“SaveStatus=SaveStatus.notapplicatable”工作正常。Microsoft的.NET命名指南建议不要使用“Enum”作为后缀@jessegavin,我知道,这正是我在回答中所说的。是的,但当我的类文件中有枚举时,这会导致命名冲突。我需要枚举时必须始终使用完整的命名空间,因为VisualStudio intellisense始终认为我指的是属性。SaveStatus=TestingDelegateCommandSave.ViewModels.SaveStatus.notapplicate;好的,我收回这一点,它与intellisense一起工作(我在那里有一些旧的…枚举代码)。美好的这就是我想要的答案,某种决定性的东西。从现在开始,我将枚举命名为与属性相同的名称。实际上,编译器可能也会对此表示不满——我只是在实际项目中尝试了一个示例。如果出现这种情况,您可以使用using语句解决它(我用一个示例更新了我的答案)。如果VisualStudio可以,那么我也可以:当我键入“SaveStatus=SaveStatus.notapplicatable”时,intellisense首先向我提供属性,然后提供枚举。该语言有许多精心设计的规则来支持此场景(我们称之为“颜色场景”),但确实存在不可避免的歧义。有关详细信息,请参阅第7.4.5.1节“相同的简单名称和类型名称”可能与我们不使用
C
前缀类和
S
前缀结构的原因相同。在现代编辑器中,修改变量或类型以区分特征是多余的。