常有人會拿var這個關鍵字來和dynamic做比較。實際上,var和dynamic完全是兩個概念,根本不應該放在一起做比較。var實際上是編譯期拋給我們的「語法糖」,一旦被編譯,編譯期會自動匹配var 變數的實際型別,並用實際型別來替換該變數的申明,這看上去就好像我們在編碼的時候是用實際型別進行申明的。而dynamic被編譯後,實際是乙個object型別,只不過編譯器會對dynamic型別進行特殊處理,讓它在編譯期間不進行任何的型別檢查,而是將型別檢查放到了執行期。
以var宣告的變數,支援「智慧型感知」,因為visual studion能推斷出var型別的實際型別,而以dynamic宣告的變數卻不支援「智慧型感知」
var的使用:
1.var只能作為區域性變數,不能作為全域性變數、靜態變數
2.定義時必須初始化,因為編譯時要推斷型別
3.初始化時不能為null
4.宣告後不能是更改型別
5.編譯時要能確認型別
使用場合
1.隱式變數: 例如 var x=1;var y = "abd";(定義時必須初始化,"var"起到佔位符作用,編譯時會編譯器會推斷型別並替換"var")
2.匿名類:
var cls = new ;
var cls2 = new ;
var cls3 = new
cls.gettype() == cls2.gettype() == cls3.gettype() 結果都是返回true. 因為編譯器只建立了乙個泛型類.
var cls4 = new
cls.gettype() == cls2.gettype() 結果返回false,名稱一致,但是順序不一致時,編譯器則會建立新的泛型類
注:匿名類不能有方法
dynamic是framework4.0的新特性。dynamic的出現讓c#具有了弱語言型別的特性。編譯器在編譯的時候不再對型別進行檢查,編譯期預設dynamic物件支援你想要的任何特性。比如,即使你對getdynamicobject方法返回的物件一無所知,你也可以像如下那樣進行**的呼叫,編譯器不會報錯:
dynamic變數是乙個object變數!
型別轉換
dynamic型別的例項和其他型別的例項間的轉換是很簡單的,開發人員能夠很方便地在dyanmic和非dynamic行為間切換。任何例項都能隱式轉換為dynamic型別例項,見下面的例子:
dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = system.datetime.today;
dynamic d4 = system.diagnostics.process.getprocesses();
反之亦然,型別為dynamic的任何表示式也能夠隱式轉換為其他型別。
int i = d1;
string str = d2;
datetime dt = d3;
system.diagnostics.process procs = d4;
方法中含有dynamic型別引數的過載問題
如果呼叫乙個方法是傳遞了dynamic型別的物件,或者被呼叫的物件是dynamic型別的,那麼過載的判斷是發生在執行時而不是編譯時。
動態語言執行時(dynamic language runtime dlr)
動態語言執行時是.net framework 4 beta 1中的一組新的api,它提供了對c#中dynamic型別的支援,也實現了像ironpython和ironruby之類的動態程式語言。
dynamic可以簡化反射。
public class testclass()
public int add(int a,int b) }
反射:var asm = assembly.loadfile(@"c:/test.dll");
var type = asm .gettype("testclass");//如果有命名空間,加上命名空間
var instance = asm.createinstance("testclass");
type.getproperty("name").setvalue(instance,"my name"); //給屬性設定值
var string = type.getproperty("name").getvalue(instance);
var method = type.getmethod("add");
object para = ;
var ret = (int) method.invoke(instance,para);
使用 dynamic:
dynamic dy= new testclass();
var ret = dy.add(1,2);
C 4 0中var和dynamic的區別
1.var表示 變數的型別是在編譯時決定的 var讓你在初始化變數時少輸入一些字,編譯器會根據右值來推斷出變數的型別,var只能用於區域性變數的定義,你不能把類的屬性定義成 var,也不能把方法的返回值型別或者是引數型別定義成var 2.dynamic表示 變數的型別是在執行時決定的 動態語言執行時...
簡述C 中關鍵字var和dynamic的區別
c 中關鍵字var和dynamic的區別如下 1 var申明的變數必須初始化,dynamic申明的變數無需初始化。2 var關鍵字只能在方法內部申明區域性變數,dynamic關鍵字可用於區域性變數,字段,引數。3 表示式不能轉型為var,但可以轉型為dynamic。4 用var關鍵字宣告變數時,編譯...
C 4 0中dynamic與var的區別
var表示 變數的型別是在編譯時決定的 但是dynamic表示 變數的型別是在執行時決定的 因此,dynamic與var具有截然不同的含義。var讓你在初始化變數時少輸入一些字,編譯器會根據右值來推斷出變數的型別。dynamic更厲害,它告訴編譯器,根本就別理究竟是啥型別,執行時再推斷不遲。var只...