C#委託的介紹(delegate、Action、Func、predicate)

委託是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞。事件是一種特殊的委託。

1.委託的聲明

  (1). delegate

delegate我們常用到的一種聲明

   Delegate至少0個參數,至多32個參數,可以無返回值,也可以指定返回值類型。

   例:

<code>

public

 

delegate

 

int

 

MethodtDelegate

(

int

 x, 

int

 y

)

;/<code>

  (2). Action

Action是無返回值的泛型委託。

   Action 表示無參,無返回值的委託

   Action 表示有傳入參數int,string無返回值的委託

  Action 表示有傳入參數int,string,bool無返回值的委託

Action 表示有傳入4個int型參數,無返回值的委託

   Action至少0個參數,至多16個參數,無返回值。

   例:

<code>        

public

void

Test(Action action,T p) { action(p); }/<code>

(3). Func

   Func是有返回值的泛型委託

   Func 表示無參,返回值為int的委託

   Func 表示傳入參數為object, string 返回值為int的委託

   Func 表示傳入參數為object, string 返回值為int的委託

   Func 表示傳入參數為T1,T2,,T3(泛型)返回值為int的委託

   Func至少0個參數,至多16個參數,根據返回值泛型返回。必須有返回值,不可void

例:

<code>        public 

int

Test(Funcint>

func

,

T1

a

,

T2

b

)

{

return

func

(a, b)

;

}   /<code>

(4) .predicate

   predicate 是返回bool型的泛型委託

   predicate 表示傳入參數為int 返回bool的委託

   Predicate有且只有一個參數,返回值固定為bool

<code>  

public

delegate

bool

Predicate (T obj)/<code>

2.委託的使用

(1).Delegate的使用

<code>

public

delegate

int

MethodDelegate

(

int

x,

int

y

)

;

private

static

MethodDelegate method;

static

void

Main

(

string

[] args

)

{ method =

new

MethodDelegate(Add); Console.WriteLine(method(

10

,

20

)); Console.ReadKey(); }

private

static

int

Add

(

int

x,

int

y

)

{

return

x + y; }/<code>

(2).Action的使用

<code>        

static

void

Main

(

string

[] args)

{ Test<

string

>(Action,

"Hello World!"

); Test<

int

>(Action,

1000

); Test<

string

>(p => { Console.WriteLine(

"{0}"

, p); },

"Hello World"

); Console.ReadKey(); }

public

static

void

Test(Action action, T p) { action(p); }

private

static

void

Action

(

string

s)

{ Console.WriteLine(s); }

private

static

void

Action

(

int

s)

{ Console.WriteLine(s); }/<code>

可以使用 Action 委託以參數形式傳遞方法,而不用顯式聲明自定義的委託。 封裝的方法必須與此委託定義的方法簽名相對應。 也就是說,封裝的方法必須具有四個均通過值傳遞給它的參數,並且不能返回值。 (在 C# 中,該方法必須返回 void)通常,這種方法用於執行某個操作。

(3).Func的使用

<code> 

static

void

Main

(

string

[] args)

{ Console.WriteLine(Test<

int

,

int

>(Fun,

100

,

200

)); Console.ReadKey(); }

public

static

int

Test(Funcint> func, T1 a, T2 b) {

return

func(a, b); }

private

static

int

Fun

(

int

a,

int

b)

{

return

a + b; }/<code>

(4). predicate的使用

  泛型委託:表示定義一組條件並確定指定對象是否符合這些條件的方法。此委託由 Array 和 List 類的幾種方法使用,用於在集合中搜索元素。

<code>

static

void

Main

(

string

[] args)

{ Point[] points = {

new

Point(

100

,

200

),

new

Point(

150

,

250

),

new

Point(

250

,

375

),

new

Point(

275

,

395

),

new

Point(

295

,

450

) }; Point first = Array.Find(points, ProductGT10); Console.WriteLine(

"Found: X = {0}, Y = {1}"

, first.X, first.Y); Console.ReadKey(); }

private

static

bool

ProductGT10

(Point p)

{

if

(p.X * p.Y >

100000

) {

return

true

; }

else

{

return

false

; } }/<code>

使用帶有 Array.Find 方法的 Predicate 委託搜索 Point 結構的數組。如果 X 和 Y 字段的乘積大於 100,000,此委託表示的方法 ProductGT10 將返回 true。Find 方法為數組的每個元素調用此委託,在符合測試條件的第一個點處停止。

3.委託的清空

  (1).在類中申明清空委託方法,依次循環去除委託引用。

方法如下:

<code>

public

MethodDelegate OnDelegate;

public

void ClearDelegate() {

while

(

this

.OnDelegate !=

null

) {

this

.OnDelegate -=

this

.OnDelegate; } } /<code>

(2).如果在類中沒有申明清空委託的方法,我們可以利用GetInvocationList查詢出委託引用,然後進行去除。  

  方法如下:

<code> 

public

MethodDelegate OnDelegate;     

static

void

Main

(

string

[] args

)

{ Program test =

new

Program();

if

(test.OnDelegate !=

null

) { System.Delegate[] dels = test.OnDelegate.GetInvocationList();

for

(

int

i =

0

; i < dels.Length; i++) { test.OnDelegate -= dels[i]

as

MethodDelegate; } } }/<code>

4.委託的特點

委託類似於 C++ 函數指針,但它們是類型安全的。
  委託允許將方法作為參數進行傳遞。
  委託可用於定義回調方法。
  委託可以鏈接在一起;例如,可以對一個事件調用多個方法。


  方法不必與委託簽名完全匹配。

5.總結:

C#委託的介紹(delegate、Action、Func、predicate)

  Delegate至少0個參數,至多32個參數,可以無返回值,也可以指定返回值類型

  Func可以接受0個至16個傳入參數,必須具有返回值

  Action可以接受0個至16個傳入參數,無返回值

  Predicate只能接受一個傳入參數,返回值為bool類型


分享到:


相關文章: