il_0001: ldc.i4.s 10
il_0003: stloc.0
il_0004: ldc.r8 1.2
il_000d: stloc.1
il_000e: ldc.r4 1.1
il_0013: stloc.2
il_0014: ldc.i4.2
il_0015: newarr [mscorlib]system.string
il_001a: stloc.s cs$0$0000
il_001c: ldloc.s cs$0$0000
il_001e: ldc.i4.0
il_001f: ldstr "a"
il_0024: stelem.ref
il_0025: ldloc.s cs$0$0000
il_0027: ldc.i4.1
il_0028: ldstr "b"
il_002d: stelem.ref
il_002e: ldloc.s cs$0$0000
il_0030: stloc.3
il_0031: ret
} // end of method program::main
我們可以看到,在c#
中定義了幾種型別,都是以var
定義的,並且都是方法內部的區域性變數。但在il
中我們會看到(紅色**)定義的區域性變數會有準確的型別。
下面我們來看一下在vs2010
中,c#4.0
中的乙個新的型別dynamic
,我們同樣來定義乙個方法:
static void main()
;
dynamic i1 = 10;
dynamic d1 = 1.2;
dynamic f1 = 1.1f;
dynamic str1 = new string ; }
再來看看他的il
.method private hidebysig static void main() cil managed
// end of method file::main
我們看到c#
中的**基本沒變,就是把var
換成dynamic
,在il
中,var
的沒有變化,但用dynamic
定義的型別(紅
色**部分)
,除了string
外都是object
型別,如果這樣看來,dynamic
其不是就是object
嗎?不是的,往下看,會發現每個型別在初始化時就個box
,就是裝箱,裝到dynamic
這種型別中了,看來dynamic
是個引用型別,是真的嗎?
現在我們從裝折箱角度來看一下這dynamic
與object
的區別。
static void method()
來看一下il
: .method private hidebysig static void method() cil managed
// end of method file::method
我們會發現int i
到object o
是box
,object o
到int i
是unbox
,但dynamic d = i; int k = (int)d;
前一行**是box
,但後一行就不是簡單的unbox
,看來object
與dynamic
則是不同的,是乙個全新的型別,當然低層做了很多任務作。
var與dynamic
還乙個區別是應用範圍,var
只能在類成員內部去應用,也就是來充當類成員的區域性變數,但dynamic
的應用範圍就大了,他和乙個基本的型別是一樣的,可以在有其他型別的任何地方應用。也就是我們的變數動態到任何地方了,不像var
只是在一定範圍內。
dynamic
雖然簡化了我們的定義,但這是以犧牲系統效能為代價的。所以大家最好能有準確的資料型別。
vs2010新特性 下
il 0001 ldc.i4.s 10 il 0003 stloc.0 il 0004 ldc.r8 1.2 il 000d stloc.1 il 000e ldc.r4 1.1 il 0013 stloc.2 il 0014 ldc.i4.2 il 0015 newarr mscorlib sys...
vs2010新特性 下
il 0001 ldc.i4.s 10 il 0003 stloc.0 il 0004 ldc.r8 1.2 il 000d stloc.1 il 000e ldc.r4 1.1 il 0013 stloc.2 il 0014 ldc.i4.2 il 0015 newarr mscorlib sys...
C 4 0和VS2010新特性
dynamic初探 以前因為某些特殊原因,需要動態的呼叫外部類 假設這個類是實現了某個帶有引數的介面函式的 通常我們只能用反 示例 如下 assembly asm assembly.loadfile xx asm.createinstance myassembly.classname gettype...