规定

  委托是一种援用方法的典型。一旦为委托分派了方法,委托将与该方法具有完全相同的行动。委托方法的运用可以像倚靠无论哪一点钟方法相等地,带有限制因素和重新提起值,如下面的示例所示:

  //Code in C#

  public delegate int PerformCalculation(int x, int y);

  与委托的署名(由重新提起典型和限制因素结合)婚配的无论哪一点钟方法都可以分派给该委托。

  简略了解Delegate委托(或代劳)是一种数据典型:它的变量可以援用到某一点钟契合提出要求的方法上,经过委托可以间接地命令该方法。

  确实.NET的委托类似地C言语的应变量指状物,分别符合.NET委托是典型无损的的,这阐明,C正中鹄的应变量指状物仅有的加标点于回忆单元的指状物。,人们不变卖这时指状物在世界上加标点于什么。

 委托运用

  • 运用委托的四部曲:
  • 规定一种委托典型

  • 委托履行时要命令方法

  • 规定一点钟委托窥测

  • 委托窥测的命令

  人们先规定一种委托典型如次:

//自规定一种委托典型

publicdelegatevoid StringProcessor(string 出口)

过后人们再规定5中候选的委托方法如次:

void PrintString(string x) void PrintInteger(int x) void PrintTwoStrings(string x, string y) int GetStringLength(string x) void PrintObject(object x)

  全部地猜猜看哪个和下面装修的委托典型署名婚配(署名婚配:限制因素典型,限制因素数与重新提起典型婚配。感动的小时立刻就来回复这时问题。,和委托典型婚配的方法是PrintString和PrintObject,后果有完全不懂的请变淡思索一下委托婚配的资格—署名婚配。

                                     

图1委托成出口

  现时对委托受胎必然的看法,接下来人们将引见委托最常常运用的空间—事情。

  人们将从发送者和接受者的角度议论事情。,拿 … 来说,在UI规划中,鼠标点击或练习用无音键盘键,传达者是CLR的.NET,在意,事情发送方不变卖接纳方是谁。,这与面容靶子的基音的是划一的。,同时事情接纳器有一点钟处置事情的方法。,这时时辰快要委托,事情发送方,犹如后面提到的,变卖什么事情接纳,经过委托作为一点钟中间,接纳方将事情处置方法报户口到事情中。,这么就变卖了由发送器->委托->接纳器的审核了。

  人们可以这么想。:委托是一点钟类,它规定了方法的典型。,容许将方法作为另一方法的限制因素递送,动态分派限制因素的方法,你可以防止顺序正中鹄的大批运用。不然(使出轨)宣判,同时,该使突出具有较好的可展开性。。

 自规定委托

  后面的单词相当多的难以了解。,接下来人们经过详尽的的事例剖析一下何谓委托,该以任何方法变卖委托。现时过失敬佩多言语演讲吗?看一眼以任何方法让人们的顺序SP!

///
/// the English 再现设备。
///

///The 命名。
publicvoid EnglishSpeaker(string 的名字)
{
(
string.Format("Hello my name is {0} and I am English 再现设备。\n", 的名字));
}
///
/// the Chineses 再现设备。
///

publicvoid ChineseSpeaker(string name)
{
(
string.Format("哈喽,我的名字是{ 0 },我说官僚的。。\n", 的名字));
}

  好啦现时人们有两个方法分或许说官僚的和英语,现时人们的顺序会说官僚的和英语啦。现时人们思索毕竟那时讲官僚的那时讲英语,把断定加出来是不容易的。,是的,人们可以经过配电盘或后果 倚靠可以变卖。

///


/// 鉴于背景的意见分歧方法的命令
///

///string
///enum
privatestaticvoid Say(string name, Language 朗)
{
switch (朗)
{
case Language.Chinese:
Program.ChineseSpeaker(的名字);
break;
case Language.English:
Program.EnglishSpeaker(的名字);
break;
default :
break;
}
}

  但推测人们现时又要累积而成新的言语西班牙语,同一人们可以累积而成西班牙语,无论如何人们只好修正使出轨宣判来累积而成断定。,这不契合面容靶子规划正中鹄的OCP(对展开吐艳,上修正和使靠近的基音的,这时辰委托该退场。

///


/// Define speak 代表.
///

///
privatedelegatevoid SpeakDelegate(string 的名字);

  率先人们规定了一种委托典型SpeakDelegate,过后人们经过修正Say方法看一眼该以任何方法运用委托变量。

///


/// The base say 效能。
///

///The 命名。
///The 再现设备。
privatestaticvoid Say(string name, SpeakDelegate 再现设备)
{
///Inoke the speaker 效能。
speaker(的名字);
}

  现时人们的限制因素不再是列举典型。,只因为一点钟委托典型变量,详尽的密码的变卖缺勤切换宣判。,这比先前简略多了。。现时你变卖怎样叫法了。!是的,人们只必要递送一点钟命名和应变量的详尽的变卖。。

///递送应变量名停止委托方法绑定
("钧航", ChineseSpeaker);
(
"", EnglishSpeaker);

  自规定委托信任全部地大都会了,接下来我将引见一下.NET中委托变卖,鉴于数不清的运用委托的事例都是事情,下面的事例也运用事情。但请全部地要在意“可以运用委托,但它不克不及规定事情(拿 … 来说):回调应变量)。

 .NET正中鹄的事情委托

  举个简略的事例,在制度中常常运用的把持扣上钮扣,当人们按下扣上钮扣 管理 drap and 下降到交交界面,过后双点取交界面的Button人们被发现的事物顺序中自然的建立了一点钟呼应Button的事情方法,过后人们向事情方法添加密码,当人们点击扣上钮扣,它的方法,但人们缺勤警告密码中有无论哪一点钟的委托和事情诸如此类的规定,实则,these.net曾经做得澄清。人们可以检查以下贴纸。

              图2事情委托变卖

  如上图所示,人们翻开设计器贴纸。,事情委托的变卖都在嗨变卖了。

采用,EventHandler是代劳型,你可以把它设想成一点钟类,各种的重新提起典型都无补。,这两个限制因素是靶子。 sender和EventArgs e,第一点钟限制因素表现原因事情的管理。,或许它是指被点击的扣上钮扣。。人们对以下密码停止了详尽的的剖析。

privatevoid button1_Click(object sender, EventArgs e)
{
//获取单击扣上钮扣的窥测
Button objBotton = sender as Button;
if (objBotton !=null)
{
objBotton.Text
="Hello you click me.";
objBotton.AutoSize
=true;
}
else
{
//Exception 严格控制。
}
}

图3点击产生

  OK现时清楚的了sender执意递送一点钟被点击靶子的窥测,次货个限制因素命名的EventArgs限制因素,用于      事情知识,它表现相互相干联的附加事情。单击扣上钮扣时,缺勤相互相干事情知识,单击下面的事情,次货个限制因素不代表无论哪一点钟有帮助的的知识。。无论如何那时可以用呢?

  让人们先引见EventArgs典型。实则,这时类缺勤这样的效能。,它次要是一点钟基类,容许倚靠类变卖假定的赋。,当人们寻觅EventArgs,人们被发现的事物,数不清的类都是吵闹了我。

publicclass EventArgs
{
// Fields
publicstaticreadonly EventArgs Empty;// Methods
static EventArgs();
public EventArgs();
}

  以imageclickeventargs为例,它吵闹了该,同时还添加了本身的音节用来基类X和Y的使动作协调值(这是一点钟ImageButton被点击时辰呼应的),过后成为扣上钮扣的x和y使动作协调。。

publicsealedclass ImageClickEventArgs : EventArgs
{
// Fields
publicint X;
publicint Y;// Methods
public ImageClickEventArgs(int x, int y)
{
this.X = x;
this.Y = y;
}
}

//图片点击呼应工夫
protectedvoid ibtnTest_Click(object sender, ImageClickEventArgs e)
{
this.lblCX.Text = e.X.ToString();
this.lblCY.Text = e.Y.ToString();
}

图4成为imageclickeventargs相互相干点击使动作协调

  后面提到的倚靠事情相干的知识典型的变卖,于是,人们还可以专用化一种事情相干知识。,如次,人们只必要吵闹EventArgs,OK。

///
/// 自规定事情相干类
///

publicclass ColorChangedEventArgs : EventArgs
{
private Color color;///
/// Initializes a new instance of the 类。
///

///The c.
public ColorChangedEventArgs(Color c)
{
color
= c;
}
///
/// Gets the color of the get.
///

///
/// The color of the get.
///
public Color GetColor
{
get { return color; }
}

}

自规定事情委托

多播委托

  后面运用的每个委托都只包括一点钟方法命令。命令一点钟委托就命令一点钟方法命令。后果要经过一点钟委托命令多个方法,那就必要运用委托的多播特点。后果命令多播委托,就可以按委托添加次第陆续命令多个方法。就此而论,委托的署名就只好重新提起void;不然,就仅仅成为委托命令的决赛一点钟方法的后果,接下视域一下组播变卖。

namespace Multi_Delegate
{
delegatevoid StringProcessor();
publicclass Person
{
privatestring _Name;
public Person(string 的名字)
{
this._Name = name;
}
publicvoid Say()
{
(
"Hello my name is {0}, what''s your 命名。\n", this的名字)
}
publicvoid Reply()
{
(
"Hello my name is {0} and nice to meet you.\n", this的名字)
}
}
class Program
{
staticvoid Main(string[] args)
{
Person Jack
=new Person("Jack");
Person Oliver
=new Person("Oliver");
StringProcessor sp
=null;
//绑定多播方法命令
sp += Jack.Say;
sp
+= Oliver.Reply;
sp();
();
}
}
}

  或许某些人以为这很简略。,变卖异乎寻常的简略明了。,执意经过“+”把方法命令绑定到委托变量中,后果人们用“-”就可以移除绑定到委托变量方法了。

 事情

  在事情出席缺勤无论哪一点钟解说。,现时让我用简言之解说事情和委托的相干吧!

  事情和委托相干就像是属性和音节的相干,为了变卖OOP的规划规律,事情对委托停止了封装。

  现时人们修正后面的密码,运用事情对委托停止封装。

/// 运用事情对委托停止封装
///
publicclass Say
{
///
/// 封装委托音节
///

publicstaticevent SpeakDelegate speakDelegate;///
/// 命令委托详尽的变卖方法
///

///
publicstaticvoid SayManager(string 的名字)
{
speakDelegate(的名字);
}
}
///
/// 客户端命令委托
///

///
staticvoid Main(string[] args)
{
Say.speakDelegate
+= Program.ChineseSpeaker;
Say.speakDelegate
+= Program.EnglishSpeaker;
Say.SayManager(
"Jackson");
();
}

图5自规定委托

  现时让人们视域一眼波湾阴谋后的类,以十分公开宣称人们的意见。:事情是对委托封装。

图6自规定事情波湾阴谋后的密码

  全部地警告在波湾阴谋后的密码中涌现了一点钟公有的委托变量,过后接下是一点钟公共的事情委托变量,这进一步阐明了事情是对委托的封装。

图7自规定事情波湾阴谋MSIL密码

事情委托变卖观察团状况

  后面人们引见了发送方和接纳方的扣上钮扣事情呼应,现时人们以设计状况正中鹄的观察团状况为例。。

图8gof观测器建筑风格

namespace GoFObserver
{
///
/// 充任主观角色
///

publicclass GofTelecom
{
publicdelegatevoid GofNews();
publicstaticevent GofNews NewEvent;///
/// 公报的方法
///

///
publicstaticbool Notify()
{
if (NewEvent !=null)
{
NewEvent();
returnfalse;
}
returntrue;
}
}
publicinterface IObserver
{
void Update();
}
///
/// 观察团
///

publicclass Programmer : IObserver
{
#region IObserver 分子publicvoid Update()
{
(
"I am a greenhand programmer.\n");
}
#endregion

}

///
/// 观察团
///

publicclass Architect : IObserver
{
#region IObserver 分子publicvoid Update()
{
(
"OH...I am a top banana.\n");
}
#endregion
}
publicclass Program
{
staticvoid Main(string[] args)
{
IList
<IObserver> objObserver =new List<IObserver>();
(
new Programmer());
(
new Architect());
foreach (IObserver ob in objObserver)
{
GofTelecom.NewEvent
+= ob.Update;
}
if (!())
{
(
"Notify successful.\n");
}
else
{
(
"Notify failed.\n");
}
();
}
}
}

Published by sayhello

发表评论

电子邮件地址不会被公开。 必填项已用*标注