Jör*_*tag 94
你似乎在混合三种完全不同的正交事物:
这三个方面是完全独立的,它们彼此没有任何关系.
静态与动态类型指的是何时进行类型检查:动态类型在运行时发生,静态类型在运行时发生.
清单与隐式类型是指类型是否在源代码中显示:清单类型意味着程序员必须将类型写入源代码,隐式类型意味着类型系统自己计算它们.
命名与匿名类型是指类型是否具有名称.
dynamic
C#4.0中的关键字表示此变量,参数,方法,字段,属性......无论是动态类型,还是在运行时都会检查其类型.未输入动态的所有内容都是静态类型的.类型是静态还是动态不仅决定何时进行类型检查,而且在C#4.0中它还确定何时进行方法分派.在C#中,方法调度在运行时之前基于静态类型(当然除了运行时子类型多态性)完成,而在C#4.0中的动态类型对象上,方法调度在运行时基于运行时类型完成.
var
C#3.0中的关键字意味着将隐式键入此局部变量,即代替程序员明确写下类型,类型系统将自行计算出来.这与动态类型无关,至少在C#3.0中是这样.该变量将被强烈静态输入,就像您自己写下该类型一样.它仅仅是一个方便的:比如,为什么你要记下所有的类型名称两次在HashMap<int, string> foo = new HashMap<int, string>();
当类型系统可以清楚地弄清楚,foo
是一个HashMap<int, string>
,所以不是你写的var foo = new HashMap<int, string();
.请注意,这没有任何动态或匿名.类型是静态的,它有一个名称:HashMap<int, string>
.当然,在C#4.0中,如果类型系统指出赋值的右侧是动态的,那么左侧的变量类型将是动态的.
C#3.0中的匿名类型表示此类型没有名称.嗯,实际上,真正的匿名类型需要对Common Type System进行向后兼容的更改,因此幕后实际发生的事情是编译器将为类型生成一个非常长,非常随机,唯一且非法的名称并放置匿名类型出现在哪里的名称.但从程序员的角度来看,该类型没有名称.为什么这有用?好吧,有时你会得到中间结果,你只需要简单然后再扔掉.给这些瞬态类型一个自己的名称会将它们提升到他们根本不应该得到的重要程度.但同样,这没有任何动态.
那么,如果类型没有名称,程序员怎么能引用呢?好吧,她不能!至少不是直接的.程序员可以做的是描述类型:它有两个属性,一个叫做"name"类型string
,另一个叫做"id"类型int
.这是我想要的类型,但我不在乎它叫什么.
这是作品开始融合的地方.在C#中,您必须通过显式写下类型的名称来声明局部变量的类型.但是,你怎么能写下一个没有名字的类型的名字呢?这就是var
进来的地方:因为自从C#3.0以来,这实际上已经不再适用了:你不再需要写下名字,你也可以告诉编译器弄清楚它.因此,虽然我在上面第一段中所写的内容是真的,但隐式类型和匿名类型与其他类型没有任何关系,如果没有隐式类型,匿名类型也会毫无用处.
但请注意,情况恰恰相反:没有匿名类型,隐式类型非常有用.var foo = HashMap<int, string>
很有道理,看不到任何匿名类型.
And*_*are 20
匿名类型是为您创建的真实的编译器生成类型.关于这一点的好处是编译器可以稍后重新使用此类型用于需要它的其他操作,因为它是POCO.
我对动态类型的理解是它们是后期绑定的,这意味着CLR(或DLR)将在执行时评估对象,然后使用duck typing来允许或禁止成员访问该对象.
所以我猜不同的是,匿名类型是编译器可以看到的真正的POCO,但是你只能使用动态类型是后期绑定的动态对象.
Mar*_*ell 18
该dynamic
类型基本上是object
,但将在运行时通过DLR或其他提供程序(如反射)解析所有方法/属性/运算符等调用.
这使得它非常像VB Option Strict Off
,并且使其在调用COM或DLR类型时非常通用.
有没有类型在编译时动态检查; 顺便提一下,匿名类型是适当的静态类型,类型检查的野兽(你可以在反射器中看到它们,虽然它们不漂亮).
另外,匿名类型可以由编译器专门处理; dynamic
需要广泛的运行时支持 - 因此匿名类型是C#功能,但dynamic
主要由.NET 4.0实现(具有一些C#4.0支持).
查看Ander的演示文稿:
http://channel9.msdn.com/pdc2008/TL16/
HTM
有三次,有三个演员 - 每次一个.
匿名类型由编译器声明和命名.该声明基于程序员的规范(他如何使用该类型).由于这些类型是以程序员离开过程命名的,因此它们似乎对程序员来说是无名的,因此是"匿名的".
c#中的动态类型允许您调用在编译时可能存在或不存在的方法.这对于调用未编译的python或javascript非常有用.