WEB开发网
开发学院软件开发C语言 C# 4.0: .NET Framework 4 中的新 C# 功能 阅读

C# 4.0: .NET Framework 4 中的新 C# 功能

 2010-09-30 22:47:01 来源:WEB开发网   
核心提示: 事实上,该代码会输出:Method:BarArgument:BazArgument:3Argument:MyDynamicObject通过将 d 声明为类型 dynamic,C# 4.0: .NET Framework 4 中的新 C# 功能(8),使用 MyDynamicObject 实例的代

事实上,该代码会输出:

Method: Bar 
Argument: Baz 
Argument: 3 
Argument: MyDynamicObject

通过将 d 声明为类型 dynamic,使用 MyDynamicObject 实例的代码就能有效地取消对 d 参与的操作进行的编译时检查。使用 dynamic,即表示“我不知道此变量会是什么类型的,因此我不知道它现在有哪些方法或属性。编译器,请让它们通过编译,留待运行时真正存在对象时再做判断。”因此即使编译器不知道 Bar 调用是什么意思,也能正确编译该调用。随后,在运行时,将由该对象本身来决定 Bar 调用将执行什么操作。这就是 TryInvokeMember 所知道的处理方式。

现在,假设您使用一个 Python 对象来代替 MyDynamicObject:

dynamic d = GetPythonObject(); 
d.bar("Baz", 3, d);

如果该对象是下面列出的文件,则该代码也能正确执行,并且输出几乎完全一样:

def bar(*args): 
 print "Method:", bar.__name__ 
 for x in args: 
  print "Argument:", x

实际上,每次使用 dynamic 值时,编译器都会生成一些代码,用来初始化和使用 DLR CallSite。该 CallSite 包含在运行时进行绑定所需的全部信息,包括方法名称、额外数据(例如是否在已检验上下文中执行操作)以及有关参数及其类型的信息。

如果您必须维护此代码,则此代码完全像上面所示的反射代码、ScriptObject 代码或包含 XML 查询的代码一样丑陋。这是 C# 中动态功能的要求,但您没必要像这样编写代码!

在使用 dynamic 关键字时,您的代码完全可以像您所期望的那样:像简单的方法调用、索引器调用、运算符(例如 +)、类型转换甚至复合运算符(例如 += 或 ++)。您甚至可以在语句中使用 dynamic 值,例如 if(d) 和 foreach(var x in d)。还可以通过 d && ShortCircuited 或 d ??ShortCircuited 等代码支持短路。

上一页  3 4 5 6 7 8 9 10  下一页

Tags:NET Framework 功能

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