我想知道C#枚举以及重复值会发生什么。我创建了以下小程序来测试:
namespace ConsoleTest
{
enum TestEnum
{
FirstElement = -1,
SecondElement,
ThirdElement,
Duplicate = FirstElement
}
/// <summary>
/// Summary description for MainConsole.
/// </summary>
public class MainConsole
{
/// <summary>
/// Constructor for the class.
/// </summary>
public MainConsole()
{
//
// TODO: Add constructor logic here
//
}
/// <summary>
/// Entry point for the application.
/// </summary>
/// <param name="args">Arguments to the application</param>
public static void Main(string[] args)
{
TestEnum first = TestEnum.FirstElement;
TestEnum second = TestEnum.SecondElement;
TestEnum duplicate = TestEnum.Duplicate;
foreach (string str in Enum.GetNames(typeof(TestEnum)))
{
Console.WriteLine("Name is: " + str);
}
Console.WriteLine("first string is: " + first.ToString());
Console.WriteLine("value is: " + ((int)first).ToString());
Console.WriteLine("second string is: " + second.ToString());
Console.WriteLine("value is: " + ((int)second).ToString());
Console.WriteLine("duplicate string is: " + duplicate.ToString());
Console.WriteLine("value is: " + ((int)duplicate).ToString());
TestEnum fromStr = (TestEnum)Enum.Parse(typeof(TestEnum), "duplicate", true);
Console.WriteLine("fromstr string is: " + fromStr.ToString());
Console.WriteLine("value is: " + ((int)fromStr).ToString());
if (fromStr == TestEnum.Duplicate)
{
Console.WriteLine("Duplicate compares the same as FirstElement");
}
else
{
Console.WriteLine("Duplicate does NOT compare the same as FirstElement");
}
}
}
}
产生以下输出:
Name is: SecondElement
Name is: ThirdElement
Name is: FirstElement
Name is: Duplicate
first string is: FirstElement
value is: -1
second string is: SecondElement
value is: 0
duplicate string is: FirstElement
value is: -1
fromstr string is: FirstElement
value is: -1
Duplicate compares the same as FirstElement
Press any key to continue . . .
这似乎完全是我想要和期望的,因为我正在构建一个版本标签会经常增加的东西,所以我想要一些我可以“分配”到当前版本的东西,甚至可以比较它。
这是一个问题:这种方法的缺陷是什么?有吗?它只是糟糕的风格(我不想最终在thedailywtf)?做这样的事情会有更好的方法吗?我在.NET 2.0上,没有选择转到3.5或4.0。
欢迎提出意见。
答案 0 :(得分:5)
如果您有标志枚举,则提供别名枚举值非常有用。 E.g。
[Flags]
enum Rows {
Even = 0x01,
Odd = = 0x02,
All = Even | Odd
}
但是,如果您阅读Cwalina和Abrams的框架设计指南中的枚举指南,您会发现以下建议:
不要使用enum作为开放集(例如操作系统版本,朋友的名字等)。
和
请勿在枚举中包含哨兵值。
拥有当前版本是一个标记值。
这些指南适用于框架设计,如果您只是想在应用程序内部使用枚举,那么违反这些准则可能无关紧要。但是,当其他开发人员必须使用您的代码时,Microsoft制定了这些指南以避免常见的陷阱。
答案 1 :(得分:3)
我认为它没有任何问题,实际上偶尔会做同样的事情。有时候一个方法(特别是一个随时间增长的APi的原生P / Invoke)可能会采用相同的数值,但它们意味着不同的东西,所以我喜欢有一个描述用法的枚举值名称。
答案 2 :(得分:1)
不清楚你想要达到的目标,但它对我来说并不好看。例如,在'Duplicate'之后向枚举添加另一个条目将取值0,除非您再次明确设置该值。