WEB开发网
开发学院软件开发C语言 在 C# 4.0 中使用动态关键字 阅读

在 C# 4.0 中使用动态关键字

 2010-09-30 22:45:49 来源:WEB开发网   
核心提示: 图 1 在函数的签名中使用动态属性classProgram{staticvoidMain(string[]args){//Thedynamicvariablegetsthereturn//valueofafunctioncallandoutputsit.dynamicx=DoubleIt(2);

图 1 在函数的签名中使用动态属性

class Program { 
 static void Main(string[] args) { 
  // The dynamic variable gets the return 
  // value of a function call and outputs it. 
  dynamic x = DoubleIt(2); 
  Console.WriteLine(x); 
 
  // Stop and wait 
  Console.WriteLine(“Press any key”); 
  Console.ReadLine(); 
 } 
 
 // The function receives and returns a dynamic object 
 private static dynamic DoubleIt(dynamic p) { 
  // Attempt to "double" the argument whatever 
  // that happens to produce 
   
  return p + p; 
 } 
}

如果您输入数值 2,然后运行此代码,您将得到数值 4;而如果您作为字符串输入 2,您会得到 22。此函数会根据操作数的运行时类型对 + 运算符进行动态解析。如果您将类型更改为 System.Object,会收到编译错误,原因即在于 + 运算符未在 System.Object 上进行定义。动态关键字能使不可能变成可能。

动态与 System.Object

直到 .NET Framework 4,还是只能求助于通用基类,才能使方法可根据不同的情况返回不同的类型。您可能已经通过求助于 System.Object 解决了此问题。返回 System.Object 的函数会向调用者提供可以转换几乎任何内容的实例。这种情况下,为什么还说使用动态的效果要好于使用 System.Object 呢?

在 C# 4 中,被声明为动态的变量后面的实际类型是在运行时加以解析,编译器会认定:声明为动态的变量中的对象完全支持任何操作。也就是说,您编写的代码完全可以调用您认为会在运行时出现的对象上的方法,如下所示:

dynamic p = GetSomeReturnValue(); 
p.DoSomething();

在 C# 4.0 中,编译器不会对该代码报错。而使用 System.Object 的类似代码将无法进行编译,为了解决这一问题,需要您自己采取一定措施,如进行反射或冒一定风险进行转换。

var 与动态

var 与动态关键字只是表面上相似。var 认为,此变量的类型必须被设置为初始值设定项的编译时类型。

但是,动态意味着此变量的类型可以是 C#4.0 中可用的任何动态类型。动态与 var 的最终含义基本上是相反的。var 讲的是加强与改进静态类型化。其目标是确保编译器可根据初始值设定项返回的确切类型推断变量类型。

动态关键字的目标是完全避免静态类型化。用于变量声明中时,动态会指示编译器完全停止求解变量类型。该类型需要采纳它在运行时的类型。而使用 var 时,您的代码会采用静态类型化方式,其结果与选择在变量声明中使用显式类型的经典方式一致。

两类关键字之间的另一区别是:var 只能出现在局部变量声明中。您不能使用 var 来定义类属性,也不能用它来指定返回值或函数的参数。

作为一名开发人员,如果预计变量包含不确定类型的对象,您就应该使用动态关键字,如对象从 COM 或 DOM API 返回;从动态语言(如 IronRuby)获得;从反射获得;从使用新扩展功能在 C# 4.0 中动态构建的对象中获得。

不过,动态类型不是绕过类型检查,只是将其全部移至运行时。如果在运行时发现不兼容的类型,则引出异常。

上一页  1 2 3 4 

Tags:使用 动态 关键字

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接