静态语言:静态类型语言的类型判断是在运行前判断(如编译阶段)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 ""; } } } }
结果: