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下才可以执行。

  

 

 

posted @ 2015-03-24 18:12  lzt-software  阅读(351)  评论(0编辑  收藏  举报