vs2010新特性 下

2021-09-03 05:56:47 字數 2088 閱讀 7383

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...