8 1 2 在 C 中把行為表示成函式

2021-08-25 21:56:38 字數 1541 閱讀 7030

8.1.2 在 c# 中把行為表示成函式

我們前面提到過,以物件導向的方式理解函式,就是把它認為是有乙個單獨方法的介面。如果我們看一下清單 8.1 的**,可以看到 iclienttest 就是這樣宣告的。這意味著,這個測試可以很容易地表示成乙個簡單的函式。在 c# 中,我們可以使用 lambda 函式來寫測試:

func isriskyyearsinjob =

client => client.yearsinjob < 2;

不使用介面型別,現在,我們使用 func,它表示乙個函式,取 client 作為引數值,並返回布林值。通過以這種方式寫**,我們顯著了減少樣本**的數量,圍繞在表示測試的表示式外圍的。

正如我們可以集合中儲存物件,實現介面,我們也可以可以建立乙個集合,儲存函式值,在清單 8.2 中,你將看到,如何使用 list 型別來實現。注意,我們要建立乙個完全標準的物件集合——我們可以遍歷集合中的所有函式,或者,通過新增或刪除某些函式值,來改變集合。

當初始化集合時,我們可以很容易地寫**,在乙個單獨的方法中,指定測試的預設集。我們可以使用 lambda 函式的語法,新增這些測試,而無需預先宣告這些函式,也可以使用 c# 3.0 的功能,稱為集合初始化器(collection initializer),使使語法更簡潔。

listing 8.2 loan suitability tests using a list of functions (c#)

class client

public int income

public int yearsinjob

public bool usescreditcard

public bool criminalrecord

} static listgettests() ;

}清單 8.2 使用了許多c# 3.0 的新功能,由於這些功能,使之頗為類似於 f# 的實現。首先,我們宣告乙個類,來儲存有關客戶資訊,使用自動屬性。接下來,我們實現乙個方法,返回測試的集合。方法的主體就是乙個單獨的 return 語句,建立 .net 列表型別,並使用集合初始化器,初始化它的元素。可以用相同的方式,在建立集合時為陣列指定的值。在這個外表之下,是呼叫集合的 add 方法,但它是更清晰。

儲存在集合中的值,是使用 lambda 函式語法寫的函式。注意,我們不必指定 client 引數值的型別。這是因為,c# 編譯器知道 add 方法的引數值,是與泛型型別引數相同的,在我們的例子中,是 func。

注意以行為為中心程式的乙個經常要求,是從庫中動態地載入新的行為的能力。對於我們的應用程式,將意味著,有人會寫 .net 類庫,有包含

gettests 方法的型別。這將返回測試列表,像早前的**一樣;我們的程式會呼叫這個方法,在執行時得到測試,並可以執行測試,而無需知道更多有關的內容。

這可以使用來自 system.reflection 命名空間標準 .net 類,來實現。典型的情況是動態引導程式集,找到這個程式集內的所有適當的類,並在執行時建立它們的例項。在本書的**上可以找到有關使用反射的詳細資訊。

現在,我們有乙個類來表示客戶,和乙個測試集合,建議我們是否向該客戶提供貸款,讓我們看看如何執行測試。

在C中呼叫C 函式

由於c編譯器與c 編譯器之間的區別十分巨大,因此二者之間不可以直接互相呼叫各自的函式介面。但是,使用extern c 可以實現在c 中呼叫c 函式的功能,反之亦可。extern c 告訴c 編譯器,將花括號中的 按照c語言的規則進行編譯與鏈結。cppprint.cpp cppprint.h call...

C 中如何把函式當做引數傳遞到別的函式中

問題 c 想要傳遞函式引數,但是引數型別是函式,不知道如何傳遞。解決過程 1.找了半天,看到這裡 把函式名作為引數傳遞 c 委託的宣告和使用,說到用delegate,但是感覺有點複雜,而且不太像是能方便的解決此處的問題。2.說實話,找了其他一些類似的帖子,還是沒太看懂。3.不過最後還是自己在他們的描...

在C 中函式的研究

初學者往往會對函式這樣的問題比較的困惑,比如說 函式的引數方法以及函式的返回型別.對於這些問題如果沒有乙個系統了解,務必會是更深層次學習的乙個絆腳石.下面我就在c 中函式若干問題加以研究,希望各位學員能夠有深層次的了解.1.函式引數的傳遞方法.我們知道函式具體實現的時候需要從主調函式傳遞引數到被調函...