C 中 Var 和 dynamic 整理介紹

2021-06-28 08:31:24 字數 2377 閱讀 4430

常有人會拿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只...