C 深入淺出Dynamic

2021-10-13 07:29:21 字數 2374 閱讀 2916

我們知道c#是乙個強型別語言,也就是說編譯器在編譯的時候會堅持資料型別是否正確。

但是dynamic的出現讓c#具有了弱語言型別的特性。編譯器在編譯的時候不再對型別進行檢查,編譯器預設dynamic物件支援你想要的任何特性。

dynamic dy =

100;

dy.name =89;

dy.getname()

;

上例中,我們將乙個dynamic物件賦值為100,並且呼叫了dynamic物件的name屬性和getname()方法,在編譯器中都不會報錯。直到執行的時候才報錯表示沒有定義name。

var實際上是編譯器的語法糖,一旦被編譯,編譯器會自動匹配var變數的實際型別,並用實際型別來替換該變數的申明。而dynamic被編譯後實際是乙個object型別,只不過編譯器會對dynamic型別進行特殊處理,讓它在編譯期間不進行任何的型別檢查,二是將型別檢查發放到了執行期。

1、任何勢力型別都可以隱式轉換為dynamic型別例項

2、型別為dynamic的任何表示式也可以隱式轉換為其他型別

dynamic dy1 =

100;

dynamic dy2 =

"12121"

;dynamic dy3 =

newobject()

;int d1 = dy1;

string d2 = dy2;

//如果隱式轉換為int型別,在執行時也會報錯。

object d3 = dy3;

上例**中,如果將dy2物件也隱式轉換為int型別,雖然編譯的時候不會報錯,但是在執行過程中還是會報錯。

首先我們自定義乙個person類:

public

class

person

public

string

getname()

}

然後我們使用反射來建立它的乙個例項並呼叫getname()方法。

object p = activator.

createinstance

(typeof

(person)

,new

object

);string name =

((person)p)

.getname()

; console.

writeline

(name)

;

createinstance()方法返回的是乙個object型別,如果我們想要呼叫getname()方法,必須將它強轉為person型別。

但是,如果我們使用乙個dynamic型別來接收creatinstance()的返回值呢?沒錯!dynamic型別可以直接條用getname()方法,不需要進行乙個強轉換。

dynamic p = activator.createinstance(typeof(person), new object );

string name = p.getname();

console.writeline(name);

效能的比較:

dynamic dyp = activator.

createinstance

(typeof

(person)

,new

object

);object obp= activator.

createinstance

(typeof

(person)

,new

object

);stopwatch stopwatch =

newstopwatch()

; stopwatch.

restart()

;for

(int i =

0; i <

10000

; i++

) console.

writeline

(stopwatch.elapsed.totalmilliseconds)

; stopwatch.

restart()

;for

(int i =

0; i <

10000

; i++

) console.

writeline

(stopwatch.elapsed.totalmilliseconds)

;

output:94.7687

1.1932

顯然,使用dynamic型別效率低好多。

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...

深入淺出ShellExecute

ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...

深入淺出ShellExecute

深入淺出shellexecute譯者 徐景周 原作 nishant s q 如何開啟乙個應用程式?shellexecute this m hwnd,open calc.exe sw show 或shellexecute this m hwnd,open notepad.exe c mylog.log...