您的位置:首页 > 编程语言 > C#

C#委托的介绍(delegate、Action、Func、predicate)

2014-11-06 17:52 441 查看
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。

============================================================================================

1、delegate(常用的一种声明,匿名方法)

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。

public delegate void MyDelegate(string name);
public class MyBlogBase
{
private MyDelegate mydelegate;
}
(1) 自定义Delegate时,我们常常发现Delegate必须全局可见,才能在其他地方可见并使用,而下面Action,Func的出现改变了这一局面,这两个其实说白了就是系统定义好的Delegate。

(2) 其实匿名方法,有个优点,就是可以直接使用当前函数出现的变量,代码更简洁,但可能有些人觉得不易读

============================================================================================

2、Action(无返回值的泛型委托)

(1) Action 默示无参,无返回值的委托

(2) Action<int,string> 默示有传入参数int,string无返回值的委托

(3) Action<int,string,bool> 默示有传入参数int,string,bool无返回值的委托

(4) Action<int,int,int,int> 默示有传入4个int型参数,无返回值的委托

Action至少0个参数,至多16个参数,无返回值。

Action<T>:封装一个方法,该方法只有一个参数并且不返回值。其中T是可接收的任何类型。使用代码如下:

public static void Main()
{
Action<string> messageTarget;

//方法是实例化 Action<T> 委托,而不是显式定义一个新委托并将命名方法分配给该委托。
messageTarget = ShowWindowsMessage;
messageTarget("Hello, World1!");

// Action<T> 委托与匿名方法一起使用
messageTarget = delegate(string s) {ShowWindowsMessage(s); };
messageTarget("Hello, World2!");

//将 lambda 表达式分配给 Action<T> 委托实例
messageTarget = s => ShowWindowsMessage(s);
messageTarget("Hello, World3!");
}

private static void ShowWindowsMessage(string message)
{
MessageBox.Show(message);
}


============================================================================================
3、Func(有返回值的泛型委托)
(1) Func<int> 默示无参,返回值为int的委托

(2) Func<object,string,int> 默示传入参数为object, string 返回值为int的委托

(3) Func<object,string,int> 默示传入参数为object, string 返回值为int的委托

(4) Func<T1,T2,,T3,int> 默示传入参数为T1,T2,,T3(泛型)返回值为int的委托

Func至少0个参数,至多16个参数,按照返回值泛型返回。

必须有返回值,不成void。

public static void Main()
{
// 实例化 Func<T, TResult> 委托
Func<string, string> convertMethod = UppercaseString;
string name = "Dakota1";
Console.WriteLine(convertMethod(name));

//将 Func<T, TResult> 委托与匿名方法一起使用
Func<string, string> convert = delegate(string s)
{ return UppercaseString(s);};

string name = "Dakota2";
Console.WriteLine(convert(name));

//将 lambda 表达式分配给 Func<T, TResult> 委托。
Func<string, string> convert = s => UppercaseString(s);
string name = "Dakota";
Console.WriteLine(convert(name));
}

private static string UppercaseString(string inputString)
{
return inputString.ToUpper();
}


============================================================================================
4、Predicate(返回bool型的泛型委托)

(1) predicate<int> 默示传入参数为int 返回bool的委托

Predicate有且只有一个参数,返回值固定为bool

Predicate<T>返回值为bool无重载,表示定义一组条件并确定指定对象是否符合这些条件的方法.此方法常在集合的查找中被用到,如:数组,正则拼配的结果集中被用到。使用此方法快捷方便,使用代码如下:

Predicate<int> myPredicate;
int[] myNum = new int[8] { 12, 33, 89, 21, 15, 29, 40, 52 };
public int[] myResult;
public MyBlogBase()
{
myPredicate = delegate(int curNum)             { if (curNum % 2 == 0) return true;               else return false;             };
}
public void StartPredicate()
{
myResult = Array.FindAll(myNum, myPredicate);
}
上例中说明了Predicate的使用,FindAll方法中,参数2即是一个Predicate,在具体的执行中,每一个数组的元素都会执行指定的方法,如果满足要求返回true,并会被存放在结果集中,不符合的则被剔除,最终返回的集合,即是结果判断后想要的集合,此方法应用场景感觉像迭代中的yield。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: