c#是一門靜態型別的語言,但是在c#4.0時微軟引入了動態型別的概念。
關鍵字dynamic用來定義動態物件,我們來看一下動態型別的一些特性。
1using
system;23
namespace
study414
15private
static object getobject(int
type)
1622
return
newrobot();23}
24}2526
public
class
dog2732}
3334
public
class
robot
3540
}41 }
我們的兩個類沒有繼承也沒有應用相同的介面,但是可以呼叫到相同的方法,使用getobject(1)可以得到想要的結果。
這就是動態型別,在編譯時不會對方法等進行判斷,而是在執行時才進行處理,如果呼叫到不存在的方法才會報錯。
c#編譯器允許你通過dynamic物件呼叫任何方法,即使這個方法根本不存在,編譯器也不會在編譯的時候報編譯錯誤。只有在執行的時候,它才會檢查這個物件的實際型別,並檢查在它上面talk()是什麼意思。動態型別將使得c#可以以更加統一而便利的形式表示下列物件:不能呼叫擴充套件方法;當我們得到乙個動態型別的物件時,不管它是來自com還是ironpython、html dom還是反射,只需要對其進行操作即可,動態語言執行時(dlr)會幫我們指出針對特定的物件以及這些操作的具體意義。這將給我們的開發帶來極大的靈活性,並且能夠極大程度上地精簡我們的**。
委託與動態型別不能進行隱式轉換;
不能呼叫建構函式和靜態方法;
類不能繼承dynamic、泛型引數不能使用dynamic和介面實現也不能使用dynamic;
實現動態行為有3種方法,分別可以用在不同的場合。
直接使用expandoobject類來實現動態行為,**如下:
1using
system;
2using
system.dynamic;34
namespace
study523
}24 }
輸出如下:
1name: li lei
2 age: 20
3 add: 223
通過繼承dynamicobject類也可以實現動態效果,示例如下:
1using
system;
2using
system.dynamic;34
namespace
study517
}1819public
class
myclass : dynamicobject
2026
27public
override
bool tryinvokemember(invokememberbinder binder, object args, out
object
result)
2833
}34 }
輸出如下:
1設定name為li lei
2設定age為20
3 呼叫callfunc方法
如果已經繼承了其它的類,則可以通過實現idynamicmetaobjectprovider介面來實現動態行為,例子如下:
1using
system;
2using
system.dynamic;
3using
system.linq.expressions;45
namespace
study616
}1718public
class
myclass : idynamicmetaobjectprovider
1925}26
27public
class
metadynamic : dynamicmetaobject
2832
33public
override
dynamicmetaobject bindinvokemember(invokememberbinder binder, dynamicmetaobject args)
3441
}42 }
輸出如下:
1獲取元資料
2 呼叫callfunc方法
十一 動態元件 非同步元件
1.使用 is 進行元件的切換顯示 這樣是重新建立了元件 如果要保持元件的狀態,比如開啟的選單欄還是保持展開的 就可以這樣 1.定義就是元件在定義的時候什麼都不做,只是在需要元件的時候進行載入,第一次載入完成後,進行快取,下次訪問直接用 2.實現按需載入 vue實現按需載入,官方推薦使用結合webp...
演算法設計與分析 十一 動態規劃
這題是典型的卡特蘭數的例子,首先我們先來了解一下卡特蘭數是什麼,其遞推公式為 這道題就是根據這個遞推公式進行求解。對於這題,遞推公式的具體含義是 dp 0 1 dp 1 1代表是1作為根,則明顯有一種情況。dp 2 dp 0 dp 1 dp 1 dp 0 代表有兩個數,當1為根時,有dp 0 dp ...
c 學習筆記十一
類 1 封裝 繼承多型 2 類的定義 class box 3 建構函式 示例 如下 class box 方法 double box value 預設的建構函式 如果沒有定義構造成器,編譯器會自動生成乙個 預設的初始化值 在定義有引數的構造成函式後,可以去掉預設的構 造器 在構造器中使用初始化列表 示...