C 學習筆記(十一) 動態型別

2021-09-07 01:12:41 字數 2364 閱讀 2772

c#是一門靜態型別的語言,但是在c#4.0時微軟引入了動態型別的概念。

關鍵字dynamic用來定義動態物件,我們來看一下動態型別的一些特性。

1

using

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類來實現動態行為,**如下:

1

using

system;

2using

system.dynamic;34

namespace

study523

}24 }

輸出如下:

1

name: li lei

2 age: 20

3 add: 223

通過繼承dynamicobject類也可以實現動態效果,示例如下:

1

using

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介面來實現動態行為,例子如下:

1

using

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 預設的建構函式 如果沒有定義構造成器,編譯器會自動生成乙個 預設的初始化值 在定義有引數的構造成函式後,可以去掉預設的構 造器 在構造器中使用初始化列表 示...