您的位置:首页 > 编程语言 > C#

C# var标识符 和 dynamic关键字

2013-05-19 14:15 489 查看
静态语言:静态类型语言的类型判断是在运行前判断(如编译阶段)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 "";
}
}

}
}


结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: