📄 22.1.htm
字号:
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Hyperlinked ECMA C# Language Specification</title><meta name="author" content="Jon Jagger" /><link rel="stylesheet" href="ecma334.css"></link></head><body><div align="right"><em><a href="http://www.jaggersoft.com">Jon Jagger</a></em></div><div align="right"><a href="mailto:jon@jaggersoft.com">jon@jaggersoft.com</a></div><form method="get" action="http://search.atomz.com/search/"><input size="30" name="sp-q"></input><input type="submit" value="Search C# Spec"></input><input type="hidden" name="sp-a" value="sp10024177"></input><input type="hidden" name="sp-f" value="ISO-8859-1"></input></form><a href="toc.htm">Table of Contents</a> <a href="1.htm">1</a> <a href="2.htm">2</a> <a href="3.htm">3</a> <a href="4.htm">4</a> <a href="5.htm">5</a> <a href="6.htm">6</a> <a href="7.htm">7</a> <a href="8.htm">8</a> <a href="9.htm">9</a> <a href="10.htm">10</a> <a href="11.htm">11</a> <a href="12.htm">12</a> <a href="13.htm">13</a> <a href="14.htm">14</a> <a href="15.htm">15</a> <a href="16.htm">16</a> <a href="17.htm">17</a> <a href="18.htm">18</a> <a href="19.htm">19</a> <a href="20.htm">20</a> <a href="21.htm">21</a> <a href="22.htm">22</a> <a href="23.htm">23</a> <a href="24.htm">24</a> <a href="25.htm">25</a> <a href="notes.htm">Notes</a> <a href="HyperlinkedCSharpECMA.zip">Download</a><span class="ruler"></span><span class="heading">ECMA-334 C# Language Specification</span><span class="navigate"><a href="22.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="22.2.htm"><img src="next.gif" alt="next" border="0" /></a></span><span class="clause-depth"><a href="21.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="23.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="22.htm">22</a></span><span class="clause-title-previous"> Delegates</span></span><span class="clause-depth"><a href="22.1.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="22.2.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">22.1</span><span class="clause-title"> Delegate declarations</span></span><span class="locator">
Paragraph 1</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P1S1"></a>A <span class="non-terminal"><a href="22.1.htm#delegate-declaration">delegate-declaration</a></span> is a <span class="non-terminal"><a href="16.5.htm#type-declaration">type-declaration</a></span> (<a href="16.5.htm">§16.5</a>) that declares a new delegate type.</span> <span class="grammar-production"><span class="name"><a name="delegate-declaration"></a>delegate-declaration</span> : <span class="rhs"><span class="non-terminal"><a href="24.2.htm#attributes">attributes</a></span><sub>opt</sub> <span class="non-terminal"><a href="22.1.htm#delegate-modifiers">delegate-modifiers</a></span><sub>opt</sub> <span class="keyword">delegate</span> <span class="non-terminal"><a href="17.5.htm#return-type">return-type</a></span> <span class="non-terminal"><a href="9.4.2.htm#identifier">identifier</a></span> <span class="terminal">(</span> <span class="non-terminal"><a href="17.5.1.htm#formal-parameter-list">formal-parameter-list</a></span><sub>opt</sub> <span class="terminal">)</span> <span class="terminal">;</span> </span></span><span class="grammar-production"><span class="name"><a name="delegate-modifiers"></a>delegate-modifiers</span> : <span class="rhs"><span class="non-terminal"><a href="22.1.htm#delegate-modifier">delegate-modifier</a></span> </span><span class="rhs"><span class="non-terminal"><a href="22.1.htm#delegate-modifiers">delegate-modifiers</a></span> <span class="non-terminal"><a href="22.1.htm#delegate-modifier">delegate-modifier</a></span> </span></span><span class="grammar-production"><span class="name"><a name="delegate-modifier"></a>delegate-modifier</span> : <span class="rhs"><span class="keyword">new</span> </span><span class="rhs"><span class="keyword">public</span> </span><span class="rhs"><span class="keyword">protected</span> </span><span class="rhs"><span class="keyword">internal</span> </span><span class="rhs"><span class="keyword">private</span> </span></span><span class="sentence"><span class="sentence-number">2</span> <a name="P1S2"></a>It is a compile-time error for the same modifier to appear multiple times in a delegate declaration.</span> </span><span class="locator">
Paragraph 2</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P2S1"></a>The new modifier is only permitted on delegates declared within another type, in which case it specifies that such a delegate hides an inherited member by the same name, as described in <a href="17.2.2.htm">§17.2.2</a>.</span> </span><span class="locator">
Paragraph 3</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P3S1"></a>The public, protected, internal, and private modifiers control the accessibility of the delegate type.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P3S2"></a>Depending on the context in which the delegate declaration occurs, some of these modifiers may not be permitted (<a href="10.5.1.htm">§10.5.1</a>).</span> </span><span class="locator">
Paragraph 4</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P4S1"></a>The delegate's type name is identifier.</span> </span><span class="locator">
Paragraph 5</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P5S1"></a>The optional <span class="non-terminal"><a href="17.5.1.htm#formal-parameter-list">formal-parameter-list</a></span> specifies the parameters of the delegate, and <span class="non-terminal"><a href="17.5.htm#return-type">return-type</a></span> indicates the return type of the delegate.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P5S2"></a>A method and a delegate type are compatible if both of the following are true: </span><ul><li><span class="sentence"><span class="sentence-number">3</span> <a name="P5S3"></a> They have the same number or parameters, with the same types, in the same order, with the same parameter modifiers.</span> </li><li><span class="sentence"><span class="sentence-number">4</span> <a name="P5S4"></a> Their <span class="non-terminal"><a href="17.5.htm#return-type">return-type</a></span>s are the same.</span> </li></ul></span><span class="locator">
Paragraph 6</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P6S1"></a>Delegate types in C# are name equivalent, not structurally equivalent.</span> <span class="note">[Note: However, instances of two distinct but structurally equivalent delegate types may compare as equal (<a href="14.9.8.htm">§14.9.8</a>). end note]</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P6S2"></a>Specifically, two different delegate types that have the same parameter lists and return type are considered different delegate types.</span> <span class="example">[Example: For example: <pre class="code-example">
delegate int D1(int i, double d);
class A
{
public static int M1(int a, double b) {...}
}
class B
{
delegate int D2(int c, double d);
public static int M1(int f, double g) {...}
public static void M2(int k, double l) {...}
public static int M3(int g) {...}
public static void M4(int g) {...}
}
</pre></span></span><span class="paragraph"><span class="example">The delegate types D1 and D2 are both compatible with the methods A.M1 and B.M1, since they have the same return type and parameter list; however, these delegate types are two different types, so they are not interchangeable. The delegate types D1 and D2 are incompatible with the methods B.M2, B.M3, and B.M4, since they have different return types or parameter lists. end example]</span> </span><span class="paragraph"><span class="sentence"><span class="sentence-number">3</span> <a name="P6S3"></a>The only way to declare a delegate type is via a <span class="non-terminal"><a href="22.1.htm#delegate-declaration">delegate-declaration</a></span>.</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P6S4"></a>A delegate type is a class type that is derived from System.Delegate.</span> <span class="sentence"><span class="sentence-number">5</span> <a name="P6S5"></a>Delegate types are implicitly sealed, so it is not permissible to derive any type from a delegate type.</span> <span class="sentence"><span class="sentence-number">6</span> <a name="P6S6"></a>It is also not permissible to derive a non-delegate class type from System.Delegate.</span> <span class="sentence"><span class="sentence-number">7</span> <a name="P6S7"></a>Note that System.Delegate is not itself a delegate type; it is a class type from which all delegate types are derived.</span> </span><span class="locator">
Paragraph 7</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P7S1"></a>C# provides special syntax for delegate instantiation and invocation.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P7S2"></a>Except for instantiation, any operation that can be applied to a class or class instance can also be applied to a delegate class or instance, respectively.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P7S3"></a>In particular, it is possible to access members of the System.Delegate type via the usual member access syntax.</span> </span><span class="locator">
Paragraph 8</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P8S1"></a>The set of methods encapsulated by a delegate instance is called an invocation list.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P8S2"></a>When a delegate instance is created (<a href="22.2.htm">§22.2</a>) from a single method, it encapsulates that method, and its invocation list contains only one entry.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P8S3"></a>However, when two non-null delegate instances are combined, their invocation lists are concatenated-in the order left operand then right operand-to form a new invocation list, which contains two or more entries.</span> </span><span class="locator">
Paragraph 9</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P9S1"></a>Delegates are combined using the binary + (<a href="14.7.4.htm">§14.7.4</a>) and += operators (<a href="14.13.2.htm">§14.13.2</a>).</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P9S2"></a>A delegate can be removed from a combination of delegates, using the binary (<a href="14.7.5.htm">§14.7.5</a>) -and -= operators (<a href="14.13.2.htm">§14.13.2</a>).</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P9S3"></a>Delegates can be compared for equality (<a href="14.9.8.htm">§14.9.8</a>).</span> </span><span class="paragraph"><span class="example">[Example: The following example shows the instantiation of a number of delegates, and their corresponding invocation lists: <pre class="code-example">
delegate void D(int x);
class Test
{
public static void M1(int i) {...}
public static void M2(int i) {...}
}
class Demo
{
static void Main() {
D cd1 = new D(Test.M1); // M1
D cd2 = new D(Test.M2); // m2
D cd3 = cd1 + cd2; // M1 + M2
D cd4 = cd3 + cd1; // M1 + M2 + M1
D cd5 = cd4 + cd3; // M1 + M2 + M1 + M1 + M2
}
}
</pre></span></span><span class="paragraph"><span class="example">When cd1 and cd2 are instantiated, they each encapsulate one method. When cd3 is instantiated, it has an invocation list of two methods, M1 and M2, in that order. cd4's invocation list contains M1, M2, and M1, in that order. Finally, cd5's invocation list contains M1, M2, M1, M1, and M2, in that order. </span></span><span class="paragraph"><span class="example">For more examples of combining (as well as removing) delegates, see <a href="22.3.htm">§22.3</a>. end example]</span> </span><span class="ruler"></span><table><tr><td><table align="left" bgcolor="navy"><tr bgcolor="navy"><td><font face="Arial,sans-serif" size="6" color="yellow"><strong>{ JSL }</strong></font></td></tr></table></td></tr><tr><td><font face="Arial,sans-serif" size="2" color="navy"><strong>Jagger Software Ltd</strong></font></td></tr><tr><td><font face="Arial,sans-serif" size="2" color="navy"><strong>Company # 4070126</strong></font></td></tr><tr><td><font face="Arial,sans-serif" size="2" color="navy"><strong>VAT # 762 5213 42</strong></font></td></tr></table><img src="valid-html401.png" align="left" height="31" width="88" alt="Valid HTML 4.01" /><img src="vcss.gif" align="left" height="31" width="88" alt="Valid CSS" /></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -