zoukankan      html  css  js  c++  java
  • 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下才可以执行。

      

     

     

  • 相关阅读:
    codeforce 266c Below the Diagonal 矩阵变换 (思维题)
    8月21日训练日记
    CodeForces 651B Beautiful Paintings
    CodeForces 651 C Watchmen
    CodeForces 17D Notepad(同余定理)
    CodeForces 19B Checkout Assistant
    Code Forces 18D Seller Bob(简单DP)
    HOJ Recoup Traveling Expenses(最长递减子序列变形)
    ZOJ 3469Food Delivery(区间DP)
    Code Forces 149DColoring Brackets(区间DP)
  • 原文地址:https://www.cnblogs.com/clownice/p/4363604.html
Copyright © 2011-2022 走看看