c#中定义⼀个枚举类型
看⼀下c#中如何定义⼀个枚举类型:
internal enum Color ...{
White,                            // Assigned a value of 0
Red,                            // Assigned a value of 1
Green,                        // Assigned a value of 2
Blue,                          // Assigned a value of 3
Orange                    // Assigned a value of 4
}
在看⼀下编译后的样⼦:
internal struct Color : System.Enum ...{
public const Color White = (Color) 0;
public const Color Red = (Color) 1;
public const Color Green = (Color) 2;
public const Color Blue = (Color) 3;
public const Color Orange = (Color) 4;
/
/包含Color的变量值,不能写代码直接引⽤这个实例字段
public Int32 value__;
}
在看⼀下⼏种不同的输出Color值的⽅法
Color c = Color.Blue;
Console.WriteLine(c);                                                        //“Blue”  泛型格式
Console.WriteLine(c.ToString());                                        //“Blue” 泛型格式
Console.WriteLine(c.ToString("G"));                                  //“Blue” 泛型格式
Console.WriteLine(c.ToString("D"));                                  //“3”⼗进制格式
Console.WriteLine(c.ToString("X"));                                  //“03”⼗六进制格式
c#中的System.Enum类为我们提供了好多操作枚举类型的⽅法,下⾯举⼀个例⼦:Color[] colors = (Color[]) Enum.GetValues(typeof(Color));
Console.WriteLine("Number of symbols defined: " + colors.Length);
Console.WriteLine("Value Symbol ----- ------");
Chapter 12: Enumerated Types and Bit Flags 289
foreach (Color c in colors) ...{
Console.WriteLine("{0,5:D} {0:G}", c);
}
Value Symbol
--------- -----------
0 White
1 Red
2 Green
3 Blue
4 Orange
其他⽅法⾃⼰可以去尝试⽤⼀下。我们可以在枚举类型上应⽤位标记,这样在操作它的时候会进⼀步简单,譬如我们在写FileAttributes的时候可以这样写:
String file = @"C:Boot.ini";
FileAttributes attributes = File.GetAttributes(file);
Console.WriteLine("Is {0} hidden? {1}", file,
(attributes & FileAttributes.Hidden) == FileAttributes.Hidden);
下⾯看⼀下FileAttributes的定义:
[Flags, Serializable]
public enum FileAttributes ...{
Readonly = 0x0001,
Hidden = 0x0002,
System = 0x0004,
Directory = 0x0010,
Archive = 0x0020,
Device = 0x0040,
Normal = 0x0080,
Temporary = 0x0100,
SparseFile = 0x0200,
ReparsePoint = 0x0400,
Compressed = 0x0800,
Offline = 0x1000,
NotContentIndexed = 0x2000,
Encrypted = 0x4000
}
//Flags特性代表位标记的意思,Serializable特性代表可序列化
我们也可以在⾃⼰的枚举类型上应⽤位标记,简化操作。
所有c#中的数组都隐式继承⾃System.Array类型,所有数组都隐式实现IEnumerable,ICollection,和IList接⼝。在对数组进⾏强制转换的时候要记住值类型的数组不许可被转换成任何其它类型。下⾯看个例⼦:
FileStream[,] fs2dim = new FileStream[5, 10];
Object[,] o2dim = fs2dim;
//错误,维数不同
Stream[] s1dim = (Stream[]) o2dim;
Stream[,] s2dim = (Stream[,]) o2dim;
String[,] st2dim = (String[,]) o2dim;
Int32[] i1dim = new Int32[5];
/
/错误值类型不许转换
Object[] o1dim = (Object[]) i1dim;
//可以借助Array.Copy实现转换
Object[] ob1dim = new Object[i1dim.Length];
Array.Copy(i1dim, ob1dim, i1dim.Length);
我们知道c#中的数组是基于0索引的,但是可以⽤Array.CreateInstance创建不是0索引的。但是不推荐
这样做,因为不是基于0索引的数组效率低,⽽基于0索引的数组微软做了好多优化⼯作,效率会很⾼的。
我们知道c#中只能实现单继承,但是可以实现多个接⼝,这样也就隐式的实现了多继承。c#中有两种实现接⼝的⽅法,分别为显⽰实现和隐式实现,下⾯看个例⼦:
public sealed class Program ...{
public static void Main() ...{
SimpleType st = new SimpleType();
st.Dispose();
IDisposable d = st;
d.Dispose();
}
}
internal sealed class SimpleType : IDisposable ...{
public void Dispose() ...{ Console.WriteLine("public Dispose"); }
void IDisposable.Dispose() ...{ Console.WriteLine("IDisposable Dispose"); }
}
//输出
public Dispose                                          //隐式接⼝的输出
IDisposable Dispose                                  //显⽰接⼝的输出,注意调⽤的⽅式!!
记住:在调⽤显⽰接⼝实现时⼀定要强制转换成接⼝类型才能使⽤。
下⾯看⼀下泛型接⼝和接⼝约束:
public static class SomeType ...{
private static void Test() ...{
Int32 x = 5;
Guid g = new Guid();
M(x);
M(g);
//以下调⽤⾮法
SomeType st=new SomeType();
M(st);
}
enum类型如何使用
//约束条件是:T类型必须实现 IComparable, IConvertible 这两个接⼝,否则不能调⽤M⽅法。
private static Int32 M<T>(T t) where T : IComparable, IConvertible ...{
...
}
}
转⾃:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。