快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

永乐国际AG手机下载:浅谈C中常见的委托



一提到委托,显现在我们脑海中的大年夜概是听的最多的便是类似C++的函数指针吧,呵呵,至少我的第一个反映是这样的。

关于委托的定义和应用,已经有诸多的人解说过,并且解说细致入微,尤其是张子阳的那一篇。我就不用多废话了。

本日我要说的是C#中的三种委托要领:Func委托,Action委托,Predicate委托以及这三种委托的常见应用处景。

Func,Action,Predicate周全解析

首先来阐明Func委托,经由过程MSDN我们可以懂得到,Func委托有如下的5种类型:

(1) *delegate TResult Func

();

(2)*delegate TResult Func(T1 arg1);

(3) *delegate TResult Func(T1 arg1, T2 arg2);

(4)*delegate TResult Func(T1 arg1, T2 arg2, T3 arg3);

(5)*delegate TResult FuncT1 arg1, T2 arg2, T3 arg3, T4 arg4);

此中(1)只能委托无参然则有返回值的函数,TResult便是其返回类型。

而(2)只能委托具有一个传入参数,有返回值的函数,T1为一个传入参数,TResult为返回类型。

(3)只能委托具有二个传入参数,有返回值的函数,T1和T2为两个传入参数,TResult为返回类型,(4)和(5)以此类推。

那么若何来应用呢? 下面给出一个简单的几个例子:

#region Func委托

///Func

的用法

///这里TResult代表函数的返回值类型///只能代理返回值为TResult类型的无参函数

Funcstring> func = delegate(){

return "我是Func

委托出来的结果";};

Console.WriteLine(func());Console.ReadKey();

///Func的用法

///这里的T为代理的函数的传入类型,TResult代表函数的返回值类型///只能代理参数为T类型,返回值为TResult类型的函数

Funcstring, string> funcOne = delegate(string s){

return s.ToUpper();};

Console.WriteLine(funcOne("我是Func委托出来的结果"));Console.ReadKey();

///Func的用法

///这里T1,T2为代理的函数的传入类型,TResult代表函数的返回值类型///只能代理参数为T1,T2类型,返回值为TResult类型的函数

Funcstring, string, string> funcTwo = delegate(string value1, string value2){

return value1 + " " + value2;};

Console.WriteLine(funcTwo("我是", "Func委托出来的结果"));Console.ReadKey();

#endregion

上面代码中,我用了匿名措施来代替函数,此中delegate()代表无参函数,delegate(string s)代表有一个传入参数的函数,以下的以此类推。

然后必要阐明的便是Action委托,这个委托也长短经常用的,尤其是在涉及到线程和界面交互的时刻,共同着lamada表达式应用,异常方便的实现二者的交互。后面我会提到用法。

来看看Action委托的几种体现形式:

(1) * delegate void Action(); 无参,无返回值

(2)* delegate void Action(T1 arg1);

(3)* delegate void Action(T1 arg1, T2 arg2);

(4)* delegate void ActionT1 arg1, T2 arg2, T3 arg3);

(5)* delegate void ActionT1 arg1, T2 arg2, T3 arg3, T4 arg4);

从上面可以看出,统共有5中体现形式,此中(1)既没有传入参数,也没有返回值,那么它得当代理那些无参,无返回值的函数;(2)有一个传入参数,无返回值,得当代理有参,无返回值的函数,(3)(4)(5)以此类推。最都容纳四个传入参数。

那么若何应用呢?下面有一些简单的例子:

#region Action的用法

///Action的用法///这里的T为代理函数的传入类型,无返回值

Actionstring[]> action = delegate(string[] x){

var result = from p in xwhere p.Contains("s")

select p;foreach (string s in result.ToList())

{Console.WriteLine(s);

}};

string[] str={ "charlies","nancy","alex","jimmy","selina"};action(str);

Console.ReadKey();

#endregion

上面的例子是经由过程传入的String类型的数组,找出此中包孕有字符s的项,然后输出到节制台。

着末一个便是Predicate委托,这个的形式对照少一些,便是一个传入参数,返回值为bool类型,详细示例如下:

#region Predicate

///bool Predicate的用法///输入一个T类型的参数,返回值为bool类型

Predicatestring[]> predicate = delegate(string[] x){

var result = from p in xwhere p.Contains("s")

select p;if (result.ToList().Count > 0)

{return true;

}else

{return false;

}};

string[] _value = { "charlies", "nancy", "alex", "jimmy", "selina" };if (predicate(_value))

{Console.WriteLine("They contain.");

}else

{Console.WriteLine("They don't contain.");

}Console.ReadKey();

#endregion

上面的代码着实也是判断String数组中有没有包孕s的项,有的话就在节制台打印出They contain.没有永乐国际AG手机下载的话就打印出They don't contain.

总结一下这三个的特征便是:

Func可以吸收0个至4个传入参数,必须具有返回值

Action可以吸收0个至4个传入参数,无返回值

Predicate只能吸收一个传入参数,返回值为bool类型

此中

this.Invoke(new Funcbool>(delegate()

{

button1.Text = text.ToString();

return true; //返回值

}));

下面是整个实今世码:

using System;

using System.Collections.Generic; using System.ComponentModel;

using System.Data; using System.Drawing;

using System.Linq; using System.Text;

using System.Windows.Forms; using System.Threading;

namespace DelegateIntegrateWinFormApp

{public partial class mainFrm : Form

{public mainFrm()

{InitializeComponent();

}

private void mainFrm_Load(object sender, EventArgs e){

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫*留意例子中的应用措施奸淫奸淫奸淫奸淫奸淫** delegate TResult Func

();无参,然则返回值为TResult类型

* delegate void Action(T1 arg1);有一个参数arg1,然则无返回值* delegate bool Predicate(T arg);有一个参数arg,返回bool类型

* 奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**/}

#region 使用Func实现线程和界面交互

private void AlternationUsingFunc(object text){

//无参数,然则返回值为bool类型this.Invoke(new Funcbool>(delegate()

{button1.Text = text.ToString();

ret永乐国际AG手机下载urn true; //返回值}));

}

private void AlternationUsingFuncThread(){

WaitCallback waitCallBack = new WaitCallback(this.AlternationUsingFunc);ThreadPool.QueueUserWorkItem(waitCallBack, "Func的应用")永乐国际AG手机下载;

}

private void button1_Click(object sender, EventArgs e){

AlternationUsingFuncThread();}

#endregion

#region 使用Action实现线程和界面交互

private void AlternationUsingAction(object text){

//必要一个T类型的参数,无返回值this.Invoke(new Act永乐国际AG手机下载ionobject>(delegate(object myText)

{myText = text;

button2.Text = text.ToString();}),text);

}

private void AlternationUsingActionThread(){

WaitCallback waitCallBack = new WaitCallback(this.AlternationUsingAction);ThreadPool.QueueUserWorkItem(waitCallBack,"Action的应用");

}

private void button2_Click(object sender, EventArgs e){

AlternationUsingActionThread();}

#endregion

#region 使用Predicate实现线程和界面的交互private void AlternationUsingPrecidate(object text)

{//必要一个T类型的参数,返回bool类型

this.Invoke(new Predicateobject>(delegate(object myText){

myText = text;button3.Text = myText.ToString();

return true;//返回值}),text);

}

private void AlternationUsingPrecidateThread(){

WaitCallback waitCallBack = new WaitCallback(this.AlternationUsingPrecidate);ThreadPool.QueueUserWorkItem(waitCallBack,"Predicate的应用");

}

private void button3_Click(object sender, EventArgs e){

AlternationUsingPrecidateThread();}

#endregion

}

}

那么,现在对付WPF来说,该若何来应用呢?其其实WPF中,和winform中类似,只是在WPF中要实现线程和界面的交互,我们必要用Dispatcher来实现,也便是形如Control.Dispatcher.Invoke()的要领,因为与Winform实现要领无多大年夜区别,这里我就直接附上整个代码:

using System;

using System.Collections.Generic; using System.Linq;

using System.Text; using System.Windows;

using System.Windows.Controls; using System.Windows.Data;

using System.Windows.Documents; using System.Windows.Input;

using System.Windows.Media; using System.Windows.Media.Imaging;

using System.Windows.Navigation; using System.Windows.Shapes;

using System.Threading;

namespace WpfApplication1 {

////// Interaction logic for Window1.xaml

///public partial class Window1 : Window

{public Window1()

{InitializeComponent();

}

private void Window_Loaded(object sender, RoutedEventArgs e){

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫*留意例子中的应用措施奸淫奸淫奸淫奸淫奸淫** delegate TResult Func

();无参,然则返回值为TResult类型

* delegate void Action();无参,无返回值* delegate bool Predicate(T arg);有一个参数arg,返回bool类型

* 必要留意,与WinForm中不合的是,WPF中必要使用Control.Dispatcher.Invoke来实现,其他类似.* 奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**/

}

#region 使用Func实现线程和界面交互private void AlternationUsingFunc(object text)

{//无参数,然则返回值为bool类型

button1.Dispatcher.Invoke(new Funcbool>(delegate(){

button1.Content = text.ToString();return true; //返回值

}));}

private void AlternationUsingFuncThread()

{WaitCallback waitCallBack = new WaitCallback(this.AlternationUsingFunc);

ThreadPool.QueueUserWorkItem(waitCallBack, "Func的应用");}

private void button1_Click(object sender, RoutedEventArgs e)

{AlternationUsingFuncThread();

}#endregion

#region 使用Action实现线程和界面交互

private void AlternationUsingAction(object text){

//无参数,无返回值//button2.Dispatcher.Invoke(new Action(delegate()

//{//button2.Content = text.ToString();

//}));//或者

button2.Dispatcher.Invoke((Action)(()=>{

button2.Content = text.ToString();}));

}

private void AlternationUsingActionThread(){

WaitCallback waitCallBack = new WaitCallback(this.AlternationUsingAction);ThreadPool.QueueUserWorkItem(waitCallBack, "Action的应用");

}

private void button2_Click(object sender, RoutedEventArgs e){

AlternationUsingActionThread();}

#endregion

#region 使用Predicate实现线程和界面的交互private void AlternationUsingPrecidate(object text)

{//必要一个T类型的参数,返回bool类型

this.button3.Dispatcher.Invoke(new Predicateobject>(delegate(object myText){

myText = text;button3.Content = myText.ToString();

return true;//返回值}), text);

}

private void AlternationUsingPrecidateThread(){

WaitCallback waitCallBack = new WaitCallback(this.AlternationUsingPrecidat永乐国际AG手机下载e);ThreadPool.QueueUserWorkItem(waitCallBack, "Predicate的应用");

}

private void button3_Click(object sender, RoutedEventArgs e){

AlternationUsingPrecidateThread();}

#endregion

}

}

逐个点击界面上的按钮,我们可以看到成功实现了线程和UI的交互:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: