dynamic(翻译)

So I asked this guy, what's up with the dynamic keyword, and what type was it exactly? I mean, C# isn't dynamic, right? He says:

我问这个伙计,这dynamic关键字,是什么呢,它是什么类型呢?因为 我认为,c#不是动态类型,他应该有明确的意思和类型,我说的不对吗,但他说:

 

"Oh, well it's statically-typed as a dynamic type."

它是静态类型作为动态类型。

 

Then my brain exploded and began to leak out my ears. Honestly, though, it took a second. Here's a good example from some of Ander's slides:

我的思想开始爆发,实际上,这花费了我一些时间。这里是一个好的例子

 

Calculator calc = GetCalculator();
int sum = calc.Add(10, 20);

That's the creation of an object, invokation of a method, and the collection of a return value. This is the exact same code, as the "var" type is figured out at compile time.

创建一个对象,然后这个对象的方法,并获得方法的返回值。下面是一个同样的代码,但是稍微不同的是,用到了var(var定义的对象,必须在编译时能获得它的明确引用)

 

var calc = GetCalculator();
int sum = calc.Add(10, 20);
If you wanted to do the exact same thing, except with Reflection (like if it were some other class, maybe old-COM interop, or something where the compiler didn't know a priori that Add() was available, etc) you'd do this:
如果上面的对象不能在编译时指明的话,只能用反射(例如,一些其它的类,可能是old-com interop,或者其它的一些东西,导致编译器不能预先知道这个add方法,是有效的)
object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember("Add",
    BindingFlags.InvokeMethod, null,
    new object[] { 10, 20 });
int sum = Convert.ToInt32(res);

It's pretty horrible to look at, of course. If the object is some dynamic thing (from any number of sources), we can do this:

 
上面那段代码是多么的槽糕,如果一些东西是动态的,我们就可以做成下面这个样子的
 
dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);

 

I'm told this is a dynamic expression that will be resolved at runtime.

Here's a C# program calling a method in a python (.py) file:

我告诉编译器,在运行时,解决这个对象问题。下面是利用dynamic调用python的方法。
1
2
3
4
5
6
7
ScriptRuntime py = Python.CreateRuntime();
dynamic random = py.UseFile("random.py");
 
//Make an array of numbers
var items = Enumerable.Range(1, 7).ToArray();
 
random.shuffle(items);

原文链接:http://www.hanselman.com/blog/C4AndTheDynamicKeywordWhirlwindTourAroundNET4AndVisualStudio2010Beta1.aspx

posted @ 2011-01-02 22:03  chenleinet  阅读(652)  评论(0编辑  收藏  举报