C 委託和C 6 0中可空型別

2021-09-24 13:01:46 字數 3115 閱讀 8661

什麼是委託?在.net framework中的應用非常廣泛,委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用if - else(switch)語句,同時使得程式具有更好的可擴充套件性。對observer設計模式的意義。

剛剛提到委託是乙個類,繼承自 system.multicastdelegate,multicastdelegate 又繼承自 system.delegate。.net 中與委託息息相關的概念——事件。c#在語法上對委託鏈的支援。

在c#中,編譯器為委託型別提供了+=和-=兩個操作符的過載,分別對應 delegate.combine 和

delegate.remove 方法,即是繫結(+=) 和移除(-=)定義委託的關鍵字:

delegate;

ok,大概應該了解什麼是委託後,來寫乙個測試案例,更加深刻的理解其中的奧妙;模擬乙個場景:我們程式有乙個功能:對某某人問好;這個功能需要面向國際化,國際化就需要支援多語言;是不是感覺實現起來so easy!

大部分可能會這麼寫,在沒認識委託之前是這麼實現:定義乙個列舉主要是放語言的型別:

public

enum

language

然後就是用switch啦!根據對應語言對號入座:當我使用英語的時候呼叫englishgreeting()方法,當我使用的是中文的時候呼叫chinesegreeting()方法;

public

void

getlanguage(

string

name, language lang)}

兩個方法分別是來自各種語言的輸出:

console

.writeline(

"早上好, "

+ name);

如期的在控制台應用程式中列印出 「早上好,***」

好了,功能儘管已經實現了,儘管這樣已經能解決當前的問題了,但我們很容易就想到,這個程式可擴充套件性很差勁,如果之後需求上有增加了韓語,日語...我們將要不停的修改 列舉

language,

不斷往上新增,還有調整getlanguage()中的swith;不斷的新增判斷條件;so,這種情況作為強迫症的我們必須去改進!

在使用委託之前,我們看看getlanguage方法的簽名,傳入的是兩個引數,乙個是name,控制其姓名,乙個是language 列舉,控制其語言所屬;這個時候,如果能把語言的輸出方法當作引數來傳,是不是就節省了一大截**呢,這個時候就是委託出場的時候了;

定義乙個委託

delegate

方法:

public

delegate

void

greetpeople

(string

name);

然後就是語言的輸出方法:

public

static

void

getchinese(

string

name)

public

static

void

getenglish(

string

name)

最後公共的getgreetpeople方法,這裡把

greetpeople

方法當作引數傳入

public

static

void

getgreetpeople(

string

name, greetpeople greetpeople)

我們在static

void

main()中呼叫這個方法,讓其在控制台應用程式中輸出:

getgreetpeople(

"張三"

, getchinese);

getgreetpeople(

"mr zhang"

, getenglish);

console.readkey();

顯而易見,我們如期的在面板上看到了列印出來的文字:張三,你好!mr zhang,how do you do

或者這麼用,用+=操作符進行乙個方法的繫結:

greetpeople greetpeople;

greetpeople = getchinese;

greetpeople += getenglish;

greetpeople(

"mr zhang");

從而看出,委託從擴充套件性,**的整潔度都有了大大的提公升,對一些設計模式,如observer模式中奠定的基礎

c# 6.0中可空型別

在c#程式設計中,我們可能會經常性的看到

system.nullreferenceexception:「未將物件引用設定到物件的例項

報錯,結合標題我們用乙個控制台應用程式的tesdemo來加以驗證,在c#6.0引用的可空型別的寫法;

定義乙個pstu類:裡面有三個屬性:name,age,***

class

pstu

public

intage

public

string

*** }

然後我們要做的就是在控制台中輸出

pstu的name:

pstu pstu =

null;

console.writeline(pstu.name);

當然這個是存在報錯的,因為pstu是乙個null值;但我們要的就是這個效果:

想解決這個報錯,就再簡單不過了

1. 往往就乙個if判斷,pstu不為null,name有值的情況下我們再去輸出;

2. 或者你還可以用三元運算子去寫: console.writeline(pstu ==

null

? ""

: pstu.name);

3. 在c#6.0增加了可哦那個型別之後,大大的減少了我們的**量

我們只需要這麼做即可輕鬆的排除這個錯誤:再也不用寫語句判斷了:

就乙個簡答的問號,如下

console.writeline(pstu?.name);

以上便是可控型別的用法;

C 中可空型別

c 提供了乙個特殊的資料型別,nullable 型別 可空型別 可空型別可以表示其基礎值型別正常範圍內的值,再加上乙個 null 值。例如,nullable int32 讀作 可空的 int32 可以被賦值為 2,147,483,648 到 2,147,483,647 之間的任意值,也可以被賦值為 ...

C 可空型別

可空型別只能用於值型別,不能用於引用型別,引用型別本身支援null值。如果直接把null賦值給int型別,會出現乙個錯誤 無法將 null 轉換成 int 因為它是一種值型別 賦值時應該使用 int?a null 可空型別與一元或二元運算子一起使用是,如果乙個運算元或兩個運算元都是null,其結果為...

C 可空型別

c 提供了乙個特殊的資料型別,nullable型別 可空型別 可空型別可以表示其基礎值型別正常範圍內的值,再加上乙個 null 值。例如,nullable int32 讀作 可空的 int32 可以被賦值為 2,147,483,648 到 2,147,483,647 之間的任意值,也可以被賦值為 n...