为什么C#dynamictypes是静态的?
在读取和浏览dynamic关键字时,我在[MSDN](在使用typesdynamic(C#编程指南) )中find以下行:
该types是静态types,但dynamictypes的对象绕过了静态types检查。 在大多数情况下,它具有types对象的function。
静态在上面的含义是什么,它如何绕过静态types检查?
这是静态types:
string foo = "bar";
foo
现在是一个string,所以这会导致编译时错误:
foo = 1;
即使你使用var
,它仍然是静态types的:
var foo = "bar"; // foo is now a string foo = 1; // still a compile time error
使用dynamic关键字,意味着types不会是静态的,可以改变,所以现在你可以这样做:
dynamic foo = "bar"; foo = 1; // this is now fine.
现在,为什么它说“该types是一个静态types”是因为在许多dynamic语言(如Javascript),你可以做这样的事情:
var foo = { bar: 1 };
它创build一个名为“bar”的属性的对象,然后你可以这样做:
foo.la = 2;
它为foo
的对象添加了一个新的属性。 但是,如果你在C#中尝试相同的技巧
dynamic foo = new SomeClassThatDoesntHaveABarProperty(); foo.bar = 2; // runtime error
你也不能删除一个属性。 您可以将任何types分配给dynamicvariables,但不能自行更改这些types。
如果您确实需要这种types的function,那么您需要查看ExpandoObject
正如你的描述所说, dynamic
函数就像很多情况下的一个对象。 你可以这样做:
dynamic foo = new Foo(); foo = new Bar();
就像这样:
object foo = new Foo(); foo = new Bar();
但是,当你想要使用属性或方法的差异。 随着dynamic,我可以这样做:
dynamic foo = new Foo(); foo.FooMethod(); // Note: You WILL get a runtime exception if foo doesn't have a FooMethod
但是有了一个对象,我需要这样做:
object foo = new Foo(); ((Foo)foo).FooMethod(); // Note: I HAVE to know the type at compile time here
我只能这样做,如果我已经知道我可以在编译时将 foo
types转换为Foo
types,并且如果我已经知道了,那么我可以使用Foo
作为我的types而不是object
。
这意味着声明为dynamic的variables将保持dynamictypes,例如,不能将其更改为types为int的variables。 尽pipe这个概念被绕过了,因为你可以改变variables持有的对象的types。
C#被认为是强types语言,因为variables是静态types的。 这意味着每个variables都是键入的,C#编译器可以检查代码中是否使用了正确的types。 在像大多数脚本语言那样的弱types语言中,variables的types是dynamic的。 他们可以持有任何价值。