购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

建议36:使用FCL中的委托声明

要注意FCL中存在三类这样的委托声明,它们分别是:Action、Func、Predicate。尤其是在它们的泛型版本出来以后,已经能够满足我们在实际编码过程中的大部分需要。下面是这三类委托声明的简要描述。

❑Action表示接受0个或多个输入参数,执行一段代码,没有任何返回值;

❑Func表示接受0个或多个输入参数,执行一段代码,带返回值;

❑Predicate表示定义一组条件并判断参数是否符合条件。

Action的重载版本有17个,它们分别是:


Action

Action<T>

Action<T1,T2>

……

Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>


Func与之类似,也有17个重载版本,只不过在泛型声明中多了一个返回值:


Func<TResult>

Func<T,TResult>

Func<T1,T2,TResult>

……

Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,

TResult>


注意 很少有方法的参数能够超过16个,如果真有这样的参数,我们首先需要考虑是否自己的设计存在问题。另外,我们也可以使用params关键字来减少参数的声明。如:


static void Method1(params int[]i)


表示该方法接收0个或多个整型参数。

如上所述,下面的委托声明AddHandler和PrintHandler完全是可以被Func与Action取代的:


delegate int AddHandler(int i,int j);

delegate void PrintHandler(string msg);

static void Main(string[]args)

{

AddHandler add=Add;

PrintHandler print=Print;

print(add(1,2).ToString());

}

static int Add(int i,int j)

{

return i+j;

}

static void Print(string msg)

{

Console.WriteLine(msg);

}


用Func和Action进行取代的版本是:


//省略

static void Main(string[]args)

{

Func<int,int,int>add=Add;

Action<string>print=Print;

print(add(1,2).ToString());

}

//省略


我们应该习惯在代码中使用这类委托来代替自己的委托声明。

除了Action、Func和Predicate外,FCL中还有用于表示特殊含义的委托声明。如用于表示注册事件方法的委托声明:


public delegate void EventHandler(object sender,EventArgs e);

public delegate void EventHandler<TEventArgs>(object sender,TEventArgs e);


表示线程方法的委托声明:


public delegate void ThreadStart();

public delegate void ParameterizedThreadStart(object obj);


表示异步回调的委托声明:


public delegate void AsyncCallback(IAsyncResult ar);


在FCL中每一类委托声明都代表一类特殊的用途,虽然可以使用自己的委托声明来代替,但是这样做不仅没有必要,而且会让代码失去简洁性和标准性。在我们实现自己的委托声明前,应该首先查看MSDN,确信有必要之后才这样做。 q1FcrobEKzL8oPm73n7sti60C0f+ahGbDmXdQk1XOZdgrwU0isdMFty0TodRF3F+

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开