<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Delegate_%28CLI%29</id>
	<title>Delegate (CLI) - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Delegate_%28CLI%29"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Delegate_(CLI)&amp;action=history"/>
	<updated>2026-07-18T15:31:32Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Delegate_(CLI)&amp;diff=2281917&amp;oldid=prev</id>
		<title>imported&gt;Shizhao：​回退ASPdotNET Core（对话）的编辑，改回Paho.mqtt的最后一个版本</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Delegate_(CLI)&amp;diff=2281917&amp;oldid=prev"/>
		<updated>2023-02-11T13:10:43Z</updated>

		<summary type="html">&lt;p&gt;回退&lt;a href=&quot;/wiki/Special:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/ASPdotNET_Core&quot; title=&quot;Special:用户贡献/ASPdotNET Core&quot;&gt;ASPdotNET Core&lt;/a&gt;（&lt;a href=&quot;/index.php?title=User_talk:ASPdotNET_Core&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:ASPdotNET Core（页面不存在）&quot;&gt;对话&lt;/a&gt;）的编辑，改回&lt;a href=&quot;/wiki/Special:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Paho.mqtt&quot; title=&quot;Special:用户贡献/Paho.mqtt&quot;&gt;Paho.mqtt&lt;/a&gt;的最后一个版本&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{noteTA&lt;br /&gt;
|G1=IT&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;委托&amp;#039;&amp;#039;&amp;#039;（delegate）是一种类型安全的[[函数指针]]，用于[[通用语言运行库]](CLI)。在[[C Sharp|C#]]中，delegate是一种class，包装了一个或多个函数指针及绑定的类实例。Delegate用来实现函数回调与事件接收（event listener）。Delegate对象可以作为参数传递给其他函数，以引用（referenced）封装在delegate对象中的函数，而无需在编译时刻就绑定被调用函数。 &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
| url=http://www.sturmnet.org/blog/2005/09/01/delegate-interface-speed&lt;br /&gt;
| title=Delegate calls vastly sped up in .NET 2&lt;br /&gt;
| last=Sturm&lt;br /&gt;
| first=Oliver&lt;br /&gt;
| date=2005-09-01&lt;br /&gt;
| accessdate=2007-09-09&lt;br /&gt;
| archive-date=2011-07-27&lt;br /&gt;
| archive-url=https://web.archive.org/web/20110727200054/http://www.sturmnet.org/blog/2005/09/01/delegate-interface-speed&lt;br /&gt;
| dead-url=no&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一旦为委托分配了函数方法，委托将与该函数方法具有完全相同的行为。 与委托的&amp;#039;&amp;#039;&amp;#039;[[类型特征]]&amp;#039;&amp;#039;&amp;#039;（由返回类型和参数组成）匹配的任何方法都可以分配给该委托。&lt;br /&gt;
&lt;br /&gt;
== C#例子 ==&lt;br /&gt;
声明一个&amp;lt;code&amp;gt;delegate&amp;lt;/code&amp;gt;类型，称作&amp;lt;code&amp;gt;SendMessageDelegate&amp;lt;/code&amp;gt;, 以一个&amp;lt;code&amp;gt;Message&amp;lt;/code&amp;gt;类型为参数，返回类型为&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=csharp&amp;gt;&lt;br /&gt;
delegate void SendMessageDelegate(Message message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下述代码定义了一个函数，以一个实例化的delegate类型作为形参: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=csharp&amp;gt;&lt;br /&gt;
void SendMessage(SendMessageDelegate sendMessageDelegateReference)&lt;br /&gt;
{&lt;br /&gt;
  // call the delegate and any other chained delegates synchronously&lt;br /&gt;
  sendMessageDelegateReference(new Message(&amp;quot;hello this is a sample message&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
将要封装入delegate中的一个函数的定义：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=csharp&amp;gt;&lt;br /&gt;
void HandleSendMessage(Message message)&lt;br /&gt;
{&lt;br /&gt;
  // the implementation for the Sender and Message classes are not relevant to this example&lt;br /&gt;
  Sender.Send(message);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
函数SendMessage，以SendMessageDelegate作为委托的实例作为实参： &lt;br /&gt;
&amp;lt;syntaxhighlight lang=csharp&amp;gt;&lt;br /&gt;
SendMessage(new SendMessageDelegate(HandleSendMessage));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
委托实例可以封装多个函数：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=csharp&amp;gt;&lt;br /&gt;
delegateType de1=fun1;&lt;br /&gt;
delegateType de2=fun2;&lt;br /&gt;
delegateType de3=de1+de2;//de3中有fun1、fun2两个函数的引用&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 技术实现细节 ==&lt;br /&gt;
“委托”作为类，继承自System.MulticastDelegate（抽象类）。“委托”至少0个参数，至多32个参数，可以无返回值，也可以指定返回值类型。可以认为包含：一个类对象实例的地址（Target属性），该类的一个方法的地址（Method属性），以及另一个“委托”实例的引用（reference）。因此引用一个“委托”对象，可能实际上引用了多个“委托”的实例。“委托”对象被调用时，依次调用里面的多个“委托”的实例。这对于[[事件驱动的程序]]比较有用。  &lt;br /&gt;
&lt;br /&gt;
如果“委托”封装了一个静态函数，则其内部的绑定的类对象地址为null。&lt;br /&gt;
&lt;br /&gt;
可以通过Delegate类的GetInvocationList()取出这些委托，并查看其Target和Method属性，获取所引用的方法名等信息。&lt;br /&gt;
==泛型委托==&lt;br /&gt;
关键字&amp;lt;code&amp;gt;Action&amp;lt;/code&amp;gt;定义了无返回值的泛型委托。&amp;lt;code&amp;gt;Action&amp;lt;/code&amp;gt;从0个参数，至多16个参数。例如：&lt;br /&gt;
 public Action&amp;lt;int&amp;gt; cwdelegate; //定义一个委托cwdelegate，参数是int，无返回值。&lt;br /&gt;
 &lt;br /&gt;
关键字&amp;lt;code&amp;gt;Func&amp;lt;/code&amp;gt;定义了有返回值的泛型委托。从0个参数，至多16个参数。其中最右侧的泛型类型是返回值类型。&lt;br /&gt;
&lt;br /&gt;
关键字&amp;lt;code&amp;gt;Predict&amp;lt;/code&amp;gt;定义了返回值为bool的泛型委托。&lt;br /&gt;
&lt;br /&gt;
在委托实例前，不加event，那这个委托就是一个普通的委托，可以在别的函数中调用，也可以直接用对象调用。但加上event关键字之后，只能用成员函数调用&lt;br /&gt;
&lt;br /&gt;
==用途==&lt;br /&gt;
一个常用的用途是事件处理。CLI定义了控件的标准的事件处理函数是一个“委托”，声明如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=csharp&amp;gt;&lt;br /&gt;
 public delegate void EventHandler(object sender, EventArgs e)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
这里第一个参数是发出该事件的控件的基类型object；后一个参数是事件数据的基类型EventArgs。以Button控件类为例，它有一个属性Click，定义为一个EventHandle类型的delegate:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=csharp&amp;gt;&lt;br /&gt;
 public event EventHandle Click;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
至此，我们对一个具体的button实例变量，可以给它的Click事件追加上一个或多个事件处理函数：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=csharp&amp;gt;&lt;br /&gt;
 this.button1.Click += new System.EventHandler(this.button1_click);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
对于Visual Basic，上述语句的写法是：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;&lt;br /&gt;
 AddHandler button1.click, AddressOf button1_Click&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==参考文献==&lt;br /&gt;
{{reflist}}&lt;br /&gt;
&lt;br /&gt;
== 外部链接 ==&lt;br /&gt;
*[http://msdn2.microsoft.com/en-us/library/system.delegate.aspx MSDN documentation for Delegates]{{Wayback|url=http://msdn2.microsoft.com/en-us/library/system.delegate.aspx |date=20081201223025 }}&lt;br /&gt;
*[http://net-informations.com/faq/net/delegates.htm Delegates with sample code]{{Wayback|url=http://net-informations.com/faq/net/delegates.htm |date=20140116134150 }}&lt;br /&gt;
*[https://web.archive.org/web/20120627043929/http://java.sun.com/docs/white/delegates.html Sun&amp;#039;s White Paper on Delegates]&lt;br /&gt;
*[http://msdn.microsoft.com/en-us/vjsharp/bb188664.aspx Microsoft answer to Sun]{{Wayback|url=http://msdn.microsoft.com/en-us/vjsharp/bb188664.aspx |date=20090923235014 }}&lt;br /&gt;
*[http://blog.monstuff.com/archives/000037.html Inner workings of Delegates]{{Wayback|url=http://blog.monstuff.com/archives/000037.html |date=20070918125945 }}&lt;br /&gt;
*[http://perfectjpattern.sourceforge.net/dp-delegates.html PerfectJPattern Open Source Project]{{Wayback|url=http://perfectjpattern.sourceforge.net/dp-delegates.html |date=20120209140635 }}, Provides componentized i.e. context-free and type-safe implementation of the Delegates Pattern in Java&lt;br /&gt;
 &lt;br /&gt;
[[Category:子程序]]&lt;br /&gt;
[[Category:.NET]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Shizhao</name></author>
	</entry>
</feed>