现在的位置: 首页 > 综合 > 正文

C# var标识符 和 dynamic关键字

2014年02月17日 ⁄ 综合 ⁄ 共 1989字 ⁄ 字号 评论关闭

静态语言:静态类型语言的类型判断是在运行前判断(如编译阶段)C#,C++就是静态语言

动态语言:不执行编译时类型检查,仅在运行时识别对象的类型。这种方法有利有弊:代码编写起来更快、更容易,但同时,由于您不会获得编译器错误。如javascript语言

1 var标识符

   C#中声明变量的方法 : <type>    <varName> =  <varValue>         eg   int   a  =  10;

   C#3.0引入了关键字var     他可以替代<type> 即:var  <varName>  =  <varValue>      eg    var  a=10;

代码(1)

namespace Test
{
    public class Test
    {
      
        static void Main(string[] args)
        {
            var a = 5;
            int b = 10;
            Console.WriteLine("a的类型:"+a.GetType().ToString());
            Console.WriteLine("b的类型:" + b.GetType().ToString());
            Console.Read();
        }
    }
}

结果

从结果可以看出   变量a和b的类型都是int32 ,a的类型不是var。因此注意:使用var的时候,我们声明的变量并不是var类型的,也不是声明了一个类型可变的变量,否则C#就不是强类型的语言了!var的作用只是:让编译器去判断变量的类型!如果编译器不能够确定变量的类型,编译器就不会编译!因此,在使用var的时候,必须初始化变量的值!这和下面的dynamic类型有区别,dynamic类型在编译的时候,不考虑“语义”,只在运行的时候判断。

 

代码(2)

namespace Test
{
    public class Test
    {
      
        static void Main(string[] args)
        {
            int []usuallArray=new int[100];
            var varArray = new[] { 1, 4, 41 }; //声明方式不能使用var []varArray,
                                               //元素的类型都必须统一!
                                                        //元素不能出现空null

            Console.WriteLine(varArray.GetType());
            Console.WriteLine(usuallArray.GetType());
            Console.Read();
        }
    }
}

结果:

var还可以通过数组初始化器来判断数组的类型;就是说根据数组成员的类型来判断。

注意:    1)声明方式不能使用var []varArray,     2)元素的类型都必须统一!     3)元素不能出现空null

 

2:   dynamic动态类型

      C# 4 中引入的 dynamic 关键字可使某些传统上依赖于 object 关键字的情形更容易编写和维护。实际上,动态类型在后台使用 System.Object 类型。但与 object 不同的是,动态类型不需要在编译时执行显式转换操作,因为它仅在运行时识别类型。这一点十分相像动态语言,但是C#不是动态语言。

看这段代码:

namespace Test
{
    class Program
    {
       
        static void Main(string[] args)
        {
          
		  dynamic a="1111";
		  a++;
          Console.Read();
        }

    
    }
}

编译结果正常:

 

运行结果出错:

从编译和运行这两个结果可以看出来,dynamic是在运行期间进行错误检查的!但是,var和object是在编译期间进行的!

 

那么dynamic是什么?

namespace Test
{
    public class Test
    {
      
        static void Main(string[] args)
        {
            dynamic a,b;
            a = "asdsa";
            b = 9;

            Console.WriteLine(a.GetType());
            Console.WriteLine(b.GetType());
            Console.Read();
        }
    }
}

 结果:

可以看出来。dynamic和var“相似”,但是,他们有许多不同的地方。1)var是静态,dynamic是动态的。2)var只能用于局部变量,并且var不能用于函数的返回类型。

下面这段代码能正常运行。

namespace Test
{
    class Program
    {
       
        static void Main(string[] args)
        {
          Console.Read();
        }
      public static dynamic Get(int a)
		{
	        if(a>0)
			{
				 return 1;
			 }
			else
			{
				 return "";
			 }
		}
    
    }
}

下面这段代码就不行了

namespace Test
{
    class Program
    {
       
        static void Main(string[] args)
        {
          Console.Read();
        }
      public static var Get(int a)
		{
	        if(a>0)
			{
				 return 1;
			 }
			else
			{
				 return "";
			 }
		}
    
    }
}

 结果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.