C#学习二之浅析var类型和enum枚举类型
一、var作为一个数据类型类似于object,是C#3.0开始新增的特性,称为推断类型(其实也就是弱化类型的定义) 。VAR可代替任何类
型,编译器会根据上下文来判断你到底是想用什么类型,类似 OBJECT,但是效率比OBJECT高点。我们可以赋予局部变量推断“类
型”var而不是显式类型。var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、
用户定义类型、.NET Framework类库中定义的类型或任何表达式。
在很多情况下,var 是可选的,它只是提供了语法上的便利。但在使用匿名类型初始化变量时,需要使用它。这在 LINQ 查询表达式
中很常见。
使用限制:
1. 不能将该变量初始化为 null;
2. 不能将 var 用于类范围的域。
什么时候使用var?
在查询表达式中,当难以确定查询变量的确切构造类型时,您会发现 var 也很有用。这种情况可能发生在分组和排序操作中。当在键
盘上键入变量的具体类型单调乏味时,或者当该类型显而易见或对提高代码可读性没有作用时,var 关键字也可能有用。不过,使用
var 确实可能使其他开发人员更加难以理解您的代码。
那么,使用var有什么特点需要注意呢?
1. 必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式:
var s;
s = “abcd”;
2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
3. var要求是局部变量。
最后,这么方便的数据类型是不是效率不高呢?
答案当然是否定的,var是语法糖,它让编译器自动推定类型。
int i = 1;和var i = 1;得到的目标程序完全等价。(当然了,他们俩的效率比object显然要快)。
所以不需要担心效率的影响,该需要用的时候就放心的使用它吧。
二、enum,就是枚举类型,它是struct,int,single,double一样,都属于值类型,从ValueType类型中派生,存储在栈中。它
在被创建时,不需要分配内在空间,所以对程序的性能是有好处的。
为什么要引入enum呢?
一个原因,就是让程序更加安全,添加程序的可读性,提高开发的效率。
什么时候用呢?
当我们已经确定了变更的数量,功能时可以将变更一个个的枚举出来,这时用enum.
enum的语法:
[attributes] [modifiers] enum identfier [:base type] { enumrator-list };
[attributes]:性质, 可选项;
[modifiers]:修饰符, 可选项 new, public, protected, internal, private;
identfier:标识符;
[:base type]: 基类型, 可选项。 可以是任何的整数类型,如ushort, uint, ulong, long.除了char;
enumrator-list :枚举列表,用逗号隔开的含有枚举的常量赋值表;
举例:
enum Temperatures:uint //指定基类型 { WickedCold = 0, FreezingPoint = 32, LightJacketWeather = 60, SwimmingWeather = 72, BoilingPoint = 212, }
关于枚举类型转换的问题:
基础类型不能隐式转换为枚举类型;
枚举类型也不能隐式转换为基础类型;默认情况下,枚举值显示会显示它的名称,如上述例子中,如果写
Console.WriteLine(Temperatures.wickedCold);则会显示WickedCold而不是0,必须要显示转换
如(int)WickedCold.
最后,说一下C#中的enum和C++不一样的地方,和可能会遇到的问题,比如enum为什么不能写
在main函数里面:
像如下的代码在C#中就会报错:
1 using System.Text; 2 using System.Threading.Tasks; 3 4 namespace ConsoleApplication1 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 enum SomeValues 11 { 12 First, //如果不特别设置,枚举从0开始 13 Second, //每个后续值为前一个值加1.Second = 1; 14 Third = -5, //Third = -5; 15 Fourth // Fourth = -4; 16 } 17 Console.WriteLine("这是第三个的值:{0}", SomeValues.Third); 18 19 } 20 } 21 }
导致不能执行,而报错的问题十分奇怪不能直接明白,其间原因是:
System.Enum 类型是所有枚举类型的抽象基类(它是一种与枚举类型的基础类型不同的独特类型),并且
从 System.Enum继承的成员在任何枚举类型中都可用。存在从任何枚举类型到System.Enum 的装箱转
换,并且存在从 System.Enum 到任何枚举类型的取消装箱转换。System.Enum 本身不是枚举类型。相反,
它是一个类类型,所有枚举类型都是从它派生的。类型System.Enum 从类型 System.ValueType派生,而后
者又从类型 object 派生。在运行时,类型 System.Enum 的值可以是 null或是对任何枚举类型的装了箱的值的引用。
所以,它作为一个类是不能在方法main里面定义的,必须把它提出来到namespace下或者class下才可以执行。