在阅读和探索动态关键字时,我在 《使用类型 dynamic(C#编程指南)》 的 MSDN 页面上找到了以下内容:
该类型是静态类型,但类型为 dynamic 的对象绕过了静态类型检查。在大多数情况下,它的功能类似于类型为 object。
以上句子中静态的含义是什么?它如何绕过静态类型检查?
在阅读和探索动态关键字时,我在 《使用类型 dynamic(C#编程指南)》 的 MSDN 页面上找到了以下内容:
该类型是静态类型,但类型为 dynamic 的对象绕过了静态类型检查。在大多数情况下,它的功能类似于类型为 object。
以上句子中静态的含义是什么?它如何绕过静态类型检查?
这是静态类型:
string foo = "bar";
foo
现在是一个字符串,因此这将导致编译时错误:
foo = 1;
var
,它仍然是静态类型的:var foo = "bar"; // foo is now a string
foo = 1; // still a compile time error
dynamic foo = "bar";
foo = 1; // this is now fine.
var foo = { bar: 1 };
这将创建一个具有名为“bar”的属性的对象,然后您可以执行以下操作:
foo.la = 2;
这会向foo
对象中添加一个新的属性,但如果你在C#中尝试同样的技巧,则不起作用。
dynamic foo = new SomeClassThatDoesntHaveABarProperty();
foo.bar = 2; // runtime error
您也无法删除属性。您可以将任何类型分配给动态变量,但不能更改这些类型本身。
如果您确实需要该类型的功能,则需要查看ExpandoObject
正如您的描述所说, dynamic
在许多情况下的行为类似于对象。您可以这样做:
dynamic foo = new Foo();
foo = new Bar();
object foo = new Foo();
foo = new Bar();
但是当您想要使用属性或方法时,它们之间的区别就出现了。通过动态语言,我可以这样做:
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
的类型转换为Foo
类型,我才能这样做。如果我已经知道了,那么我可以直接使用Foo
作为我的类型而不是object
。
这意味着声明为动态类型的变量将保持动态类型,不能转换为 int 类型的变量。但可以绕过此概念,因为可以更改变量保存的对象的类型。
C#被认为是一种强类型语言,因为变量是静态类型的。这意味着每个变量都有类型,并且 C# 编译器可以检查代码中使用的正确类型。在大多数脚本语言等弱类型语言中,变量的类型是动态的。它们可以保存任何值。
dynamic
引用引用的任何对象添加东西(成员),就像在动态类型语言(例如JavaScript)中一样。 - Federico Berasategui