我們知道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...