C 學習筆記 泛型委託Action和Fun

2021-09-06 03:45:07 字數 4278 閱讀 4189

本節學習了泛型委託action和fun兩類特殊的委託,這兩個特殊的委託是dot framewrok自帶的。結合lambda表示式,可以在寫程式時,簡潔**和提高編碼效率。

(一)action和fun兩個委託的不同點:

action只能委託必須是無返回值的方法

fun只是委託必須有返回值的方法

(二)**演練

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.windows.forms;

//方法一:顯式宣告了乙個委託,並將對 例項方法的引用分配給其委託例項。

public

delegate

void

showname();

public

delegate

void

shownamewithparameter(

string

name);

public

delegate

void

showage(

intage);

public

delegate

void

shownameandage(

string

name,

intage);

public

delegate

intreturnname(

string

name);

namespace

actiondemo

set}

private

intinstanceage;

public

intinstanceage

set}

public

person(

string

name,

intage)

public

void

displayname()",

this

.instancename);

}public

void

displayname(

string

name)

",name);

} public

void

displayage(

intage)

",age);

}public

void

displaynameandage(

string

name,

intage)

and age:

",name,age));

}public

intgetagebyname(

string

name)

else}}

class

program

static

void

main(

string

args)

",s); };

actionprintnameatfirst(person.instancename);

//(2)簡化

action

<

string

>

actionprintname;

actionprintname =s

=>

console.writeline(

"name:

", s);

actionprintname(person.instancename);

//示例演示如何使用 action委託來列印 list物件的內容

//使用 print 方法將列表的內容顯示到控制台上。 此外,c# 示例還演示如何使用匿名方法將內容顯示到控制台上

//請注意該示例不顯式宣告 action變數。 相反,它傳遞方法的引用,該方法採用單個引數而且不將值返回至 list.foreach 方法,其單個引數是乙個 action委託

//同樣,在 c# 示例 中,action委託不被顯式地例項化,因為匿名方法的簽名匹配 list.foreach 方法所期望的 action委託的簽名。

list

<

string

>

names

=new

list

<

string

>

();names.add(

"bruce");

names.add(

"alfred");

names.add(

"tim");

names.add(

"richard

");

names.foreach(print);

names.foreach(

delegate

(string name));

#endregion

#region

fun相關

//泛型委託func委託,這裡可以有乙個或多個或者沒有引數t,但必須有返回值並返回 tresult 引數所指定的型別的值

//(1)必須有指定引數返回值。

//(2)lambda 表示式的基礎型別是泛型 func 委託之一。 這樣能以引數形式傳遞 lambda 表示式,而不用顯式將其分配給委託。

//(3)因為 system.linq 命名空間中許多態別方法具有 func引數,因此可以給這些方法傳遞 lambda 表示式,而不用顯式例項化 func委託。

//非泛型委託實現

returnname returnname

=person.getagebyname;

console.writeline(

"age:

", returnname(person.instancename));

//泛型委託實現

func

<

string

, int

>

funreturnname

=person.getagebyname;

console.writeline(

"age:

",funreturnname(person.instancename));

//泛型匿名委託實現

//(1)初步

func

<

string

, int

>

funreturnname1

=delegate

(string

s) ;

console.writeline(

"age:

", funreturnname1(person.instancename));

//(2)優化

func

<

string

, int

>

funreturnname2 =s

=>

person.getagebyname(s);

console.writeline(

"age:

", funreturnname2(person.instancename));

//示例演示如何宣告和使用 func委託

//此示例宣告乙個 func變數,並為其分配了乙個將字串中的字元轉換為大寫的 lambda 表示式。

//隨後將封裝此方法的委託傳遞給 enumerable.select 方法,以將字串陣列中的字串更改為大寫。

func

<

string

, string

>

selector

=str

=>

str.toupper();

string

words =;

ienumerable

<

string

>

awords

=words.select(selector);

foreach

(string word

inawords)

console.writeline(word);

#endregion

console.readkey(); }}

}

一篇關於委託的很好文章

Action泛型委託

描述 封裝乙個方法,該方法只採用乙個引數並且不返回值.語法 public delegate void action t arg t 引數型別 此委託封裝的方法的引數型別 arg 引數 此委託封裝的方法的引數 備註 通過此委託,可以將方法當做引數進行傳遞.其他形式 public delegate vo...

C 學習筆記 泛型委託Action和Fun

本節學習了泛型委託action和fun兩類特殊的委託,這兩個特殊的委託是dot framewrok自帶的。結合lambda表示式,可以在寫程式時,簡潔 和提高編碼效率。一 action和fun兩個委託的不同點 action只能委託必須是無返回值的方法 fun只是委託必須有返回值的方法 二 演練 us...

C 委託基礎 泛型委託Action

c 委託基礎系列原於2011年2月份發表在我的新浪部落格中,現在將其般至本部落格。為了方便開發,net基類庫針對在實際開發中最常用的情形提供了幾個預定義好的委託,這些預定義委託用得很廣,比如在編寫lambda表示式和開發平行計算程式時經常要用到他們 對於函式返回值為空的情形,可以使用action泛型...