⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 22.3.htm

📁 This ECMA Standard specifies the form and establishes the interpretation of programs written in the
💻 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.2.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="23.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.2.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="22.3.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">22.3</span><span class="clause-title"> Delegate invocation</span></span><span class="locator">
     Paragraph 1</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P1S1"></a>C# provides special syntax for invoking a delegate.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P1S2"></a>When a non-null delegate instance whose invocation list contains one entry, is invoked, it invokes the one method with the same arguments it was given, and returns the same value as the referred to method.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P1S3"></a>(See <a href="14.5.5.2.htm">&#167;14.5.5.2</a> for detailed information on delegate invocation.)</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P1S4"></a>If an exception occurs during the invocation of such a delegate, and that exception is not caught within the method that was invoked, the search for an exception catch clause continues in the method that called the delegate, as if that method had directly called the method to which that delegate referred.</span> </span><span class="locator">
     Paragraph 2</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P2S1"></a>Invocation of a delegate instance whose invocation list contains multiple entries, proceeds by invoking each of the methods in the invocation list, synchronously, in order.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P2S2"></a>Each method so called is passed the same set of arguments as was given to the delegate instance.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P2S3"></a>If such a delegate invocation includes reference parameters (<a href="17.5.1.2.htm">&#167;17.5.1.2</a>), each method invocation will occur with a reference to the same variable; changes to that variable by one method in the invocation list will be visible to methods further down the invocation list.</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P2S4"></a>If the delegate invocation includes output parameters or a return value, their final value will come from the invocation of the last delegate in the list.</span> <span class="sentence"><span class="sentence-number">5</span> <a name="P2S5"></a>If an exception occurs during processing of the invocation of such a delegate, and that exception is not caught within the method that was invoked, the search for an exception catch clause continues in the method that called the delegate, and any methods further down the invocation list are not invoked.</span> </span><span class="locator">
     Paragraph 3</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P3S1"></a>Attempting to invoke a delegate instance whose value is null results in an exception of type System.NullReferenceException.</span> </span><span class="paragraph"><span class="example">[Example: The following example shows how to instantiate, combine, remove, and invoke delegates: <pre class="code-example">
using System;  
delegate void D(int x);  
class Test  
{  
   public static void M1(int i) {  
      Console.WriteLine("Test.M1: " + i);  
   }  
   public static void M2(int i) {  
      Console.WriteLine("Test.M2: " + i);  
   }  
   public void M3(int i) {  
      Console.WriteLine("Test.M3: " + i);  
   }  
}  
class Demo  
{  
   static void Main() {   
      D cd1 = new D(Test.M1);  
      cd1(-1);  // call M1  
      D cd2 = new D(Test.M2);  
      cd2(-2);  // call M2  
      D cd3 = cd1 + cd2;  
      cd3(10);  // call M1 then M2  
      
      cd3 += cd1;  
      cd3(20);  // call M1, M2, then M1  
      Test t = new Test();  
      D cd4 = new D(t.M3);  
      cd3 += cd4;  
      cd3(30);  // call M1, M2, M1, then M3  
      cd3 -= cd1; // remove last M1  
      cd3(40);  // call M1, M2, then M3  
      cd3 -= cd4;  
      cd3(50);  // call M1 then M2  
      cd3 -= cd2;  
      cd3(60);  // call M1  
      cd3 -= cd2; // impossible removal is benign  
      cd3(60);  // call M1  
      cd3 -= cd1; // invocation list is empty  
      //  cd3(70);  // System.NullReferenceException thrown  
      cd3 -= cd1; // impossible removal is benign  
   }  
}  
</pre></span></span><span class="paragraph"><span class="example">As shown in the statement cd3 += cd1;, a delegate can be present in an invocation list multiple times. In this case, it is simply invoked once per occurrence. In an invocation list such as this, when that delegate is removed, the last occurrence in the invocation list is the one actually removed. </span></span><span class="paragraph"><span class="example">Immediately prior to the execution of the final statement, cd3 -= cd1;, the delegate cd3 refers to an empty invocation list. Attempting to remove a delegate from an empty list (or to remove a non-existent delegate from a non-empty list) is not an error. </span></span><span class="paragraph"><span class="example">The output produced is: <pre class="code-example">
Test.M1: -1  
Test.M2: -2  
Test.M1: 10  
Test.M2: 10  
Test.M1: 20  
Test.M2: 20  
Test.M1: 20  
Test.M1: 30  
Test.M2: 30  
Test.M1: 30  
Test.M3: 30  
Test.M1: 40  
Test.M2: 40  
Test.M3: 40  
Test.M1: 50  
Test.M2: 50  
Test.M1: 60  
Test.M1: 60  
</pre>end example]</span> <span class="table-line"></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 + -