本節學習了泛型委託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泛型...