1、看一下 c#中如何定义一个枚举类型:internal enum Color .White, / Assigned a value of 0Red, / Assigned a value of 1Green, / Assigned a value of 2Blue, / Assigned a value of 3Orange / Assigned a value of 4在看一下编译后的样子:internal struct Color : System.Enum .public const Color White = (Color) 0;public const Color Red = (Col
2、or) 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.Writ
3、eLine(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.WriteL
4、ine(“Value Symbol - -“);Chapter 12: Enumerated Types and Bit Flags 289foreach (Color c in colors) .Console.WriteLine(“0,5:D 0:G“, c);Value Symbol- -0 White1 Red2 Green3 Blue4 Orange其他方法自己可以去尝试用一下。我们可以在枚举类型上应用位标记,这样在操作它的时候会进一步简单,譬如我们在写 FileAttributes 的时候可以这样写:String file = “C:Boot.ini“;FileAttributes
5、 attributes = File.GetAttributes(file);Console.WriteLine(“Is 0 hidden? 1“, file,(attributes 下面看一下 FileAttributes 的定义:Flags, Serializablepublic enum FileAttributes .Readonly = 0x0001,Hidden = 0x0002,System = 0x0004,Directory = 0x0010,Archive = 0x0020,Device = 0x0040,Normal = 0x0080,Temporary = 0x0100
6、,SparseFile = 0x0200,ReparsePoint = 0x0400,Compressed = 0x0800,Offline = 0x1000,NotContentIndexed = 0x2000,Encrypted = 0x4000/Flags 特性代表位标记的意思,Serializable 特性代表可序列化我们也可以在自己的枚举类型上应用位标记,简化操作。所有 c#中的数组都隐式继承自 System.Array 类型,所有数组都隐式实现IEnumerable,ICollection,和 IList 接口。在对数组进行强制转换的时候要记住值类型的数组不许可被转换成任何其它类型
7、。下面看个例子:FileStream, fs2dim = new FileStream5, 10;Object, o2dim = fs2dim;/错误,维数不同Stream s1dim = (Stream) o2dim;Stream, s2dim = (Stream,) o2dim;String, st2dim = (String,) o2dim;Int32 i1dim = new Int325;/错误值类型不许转换Object o1dim = (Object) i1dim;/可以借助 Array.Copy 实现转换Object ob1dim = new Objecti1dim.Length;
8、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
9、= 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 /显示接口的输出,注意
10、调用的方式!记住:在调用显示接口实现时一定要强制转换成接口类型才能使用。下面看一下泛型接口和接口约束: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);/约束条件是:T 类型必须实现 IComparable, IConvertible 这两个接口,否则不能调用 M方法。private static Int32 M(T t) where T : IComparable, IConvertible .