在C#中,是否可以使用属性修饰Enum类型或执行其他操作来指定默认值应该是什么,而不更改值?无论出于何种原因,所需的数字可能都是一成不变的,并且仍然可以控制默认值.
enum Orientation { None = -1, North = 0, East = 1, South = 2, West = 3 } Orientation o; // Is 'North' by default.
James Curran.. 332
enum
(实际上,任何值类型)的默认值为0 - 即使它不是有效值enum
.它无法改变.
enum
(实际上,任何值类型)的默认值为0 - 即使它不是有效值enum
.它无法改变.
任何枚举的默认值为零.因此,如果要将一个枚举器设置为默认值,则将其设置为零,将所有其他枚举器设置为非零(如果有多个枚举器,则第一个枚举值为零的第一个枚举器将是该枚举的默认值值为零).
enum Orientation { None = 0, //default value since it has the value '0' North = 1, East = 2, South = 3, West = 4 } Orientation o; // initialized to 'None'
如果您的枚举器不需要显式值,那么只需确保第一个枚举器是您想要成为默认枚举器的枚举器,因为"默认情况下,第一个枚举器的值为0,每个连续枚举器的值增加为1." (C#参考)
enum Orientation { None, //default value since it is the first enumerator North, East, South, West } Orientation o; // initialized to 'None'
如果零不能作为正确的默认值,则可以使用组件模型为枚举定义变通方法:
[DefaultValue(None)] public enum Orientation { None = -1, North = 0, East = 1, South = 2, West = 3 } public static class Utilities { public static TEnum GetDefaultValue() where TEnum : struct { Type t = typeof(TEnum); DefaultValueAttribute[] attributes = (DefaultValueAttribute[])t.GetCustomAttributes(typeof(DefaultValueAttribute), false); if (attributes != null && attributes.Length > 0) { return (TEnum)attributes[0].Value; } else { return default(TEnum); } } }
然后你可以打电话:
Orientation o = Utilities.GetDefaultValue(); System.Diagnostics.Debug.Print(o.ToString());
注意:您需要在文件顶部包含以下行:
using System.ComponentModel;
这不会更改枚举的实际C#语言默认值,但会提供一种指示(并获取)所需默认值的方法.
枚举的默认值是枚举等于零.我不相信这可以通过属性或其他方式改变.
(MSDN说:"枚举E的默认值是表达式(E)0产生的值.")
你不能,但如果你愿意,你可以做一些技巧.:)
public struct Orientation { ... public static Orientation None = -1; public static Orientation North = 0; public static Orientation East = 1; public static Orientation South = 2; public static Orientation West = 3; }
这个结构的用法是简单的枚举.
你可以在哪里创建pa == Orientation.East(或你想要的任何值)默认
使用技巧本身,你需要通过代码转换int.
有实施:
#region ConvertingToEnum private int val; static Dictionarydict = null; public Orientation(int val) { this.val = val; } public static implicit operator Orientation(int value) { return new Orientation(value - 1); } public static bool operator ==(Orientation a, Orientation b) { return a.val == b.val; } public static bool operator !=(Orientation a, Orientation b) { return a.val != b.val; } public override string ToString() { if (dict == null) InitializeDict(); if (dict.ContainsKey(val)) return dict[val]; return val.ToString(); } private void InitializeDict() { dict = new Dictionary (); foreach (var fields in GetType().GetFields(BindingFlags.Public | BindingFlags.Static)) { dict.Add(((Orientation)fields.GetValue(null)).val, fields.Name); } } #endregion
另一种可能有用的方法 - 使用某种"别名".例如:
public enum Status { New = 10, Old = 20, Actual = 30, // Use Status.Default to specify default status in your code. Default = New }
实际上,enum
默认enum
值是其值的第一个元素0
.
例如:
public enum Animals { Cat, Dog, Pony = 0, } //its value will actually be Cat not Pony unless you assign a non zero value to Cat. Animals animal;