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

📄 24.4.2.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="24.4.1.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="24.4.3.htm"><img src="next.gif" alt="next" border="0" /></a></span><span class="clause-depth"><a href="23.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="25.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="24.htm">24</a></span><span class="clause-title-previous"> Attributes</span></span><span class="clause-depth"><a href="24.3.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="24.4.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="24.4.htm">24.4</a></span><span class="clause-title-previous"> Reserved attributes</span></span><span class="clause-depth"><a href="24.4.1.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="24.4.3.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">24.4.2</span><span class="clause-title"> The Conditional attribute</span></span><span class="locator">
     Paragraph 1</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P1S1"></a>The attribute Conditional enables the definition of conditional methods.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P1S2"></a>The Conditional attribute indicates a condition by testing a conditional compilation symbol.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P1S3"></a>Calls to a conditional method are either included or omitted depending on whether this symbol is defined at the point of the call.</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P1S4"></a>If the symbol is defined, the call is included; otherwise, the call is omitted.</span> </span><span class="locator">
     Paragraph 2</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P2S1"></a>A conditional method is subject to the following restrictions: </span><ul><li><span class="sentence"><span class="sentence-number">2</span> <a name="P2S2"></a> The conditional method must be a method in a <span class="non-terminal"><a href="17.1.htm#class-declaration">class-declaration</a></span>.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P2S3"></a>A compile-time error occurs if the Conditional attribute is specified on an interface method.</span> </li><li><span class="sentence"><span class="sentence-number">4</span> <a name="P2S4"></a> The conditional method must have a return type of <span class="keyword">void</span>.</span> </li><li><span class="sentence"><span class="sentence-number">5</span> <a name="P2S5"></a> The conditional method must not be marked with the override modifier.</span> <span class="sentence"><span class="sentence-number">6</span> <a name="P2S6"></a>A conditional method may be marked with the virtual modifier, however.</span> <span class="sentence"><span class="sentence-number">7</span> <a name="P2S7"></a>Overrides of such a method are implicitly conditional, and must not be explicitly marked with a Conditional attribute.</span> </li><li><span class="sentence"><span class="sentence-number">8</span> <a name="P2S8"></a> The conditional method must not be an implementation of an interface method.</span> <span class="sentence"><span class="sentence-number">9</span> <a name="P2S9"></a>Otherwise, a  compile-time error occurs.</span> </li></ul></span><span class="locator">
     Paragraph 3</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P3S1"></a>In addition, a compile-time error occurs if a conditional method is used in a <span class="non-terminal"><a href="14.5.10.3.htm#delegate-creation-expression">delegate-creation-expression</a></span>.</span> </span><span class="paragraph"><span class="example">[Example: The example <pre class="code-example">
#define DEBUG  
using System;  
using System.Diagnostics;  
class Class1   
{  
   [Conditional("DEBUG")]  
   public static void M() {  
      Console.WriteLine("Executed Class1.M");  
   }  
}  
class Class2  
{  
   public static void Test() {  
      Class1.M();  
   }  
}  
</pre>declares Class1.M as a conditional method. Class2's Test method calls this method. Since the conditional compilation symbol DEBUG is defined, if Class2.Test is called, it will call M. If the symbol DEBUG had not been defined, then Class2.Test would not call Class1.M. end example]</span> </span><span class="locator">
     Paragraph 4</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P4S1"></a>It is important to note that the inclusion or exclusion of a call to a conditional method is controlled by the conditional compilation symbols at the point of the call.</span> <span class="example">[Example: In the example <pre class="code-example">
// Begin class1.cs  
using System;  
using System.Diagnostics;  
class Class1   
{  
   [Conditional("DEBUG")]  
   public static void F() {  
      Console.WriteLine("Executed Class1.F");  
   }  
}  
// End class1.cs  

// Begin class2.cs  
#define DEBUG  
class Class2  
{  
   public static void G() {  
      Class1.F();    // F is called  
   }  
}  
// End class2.cs  

// Begin class3.cs  
#undef DEBUG  
class Class3  
{  
   public static void H() {  
      Class1.F();    // F is not called  
   }  
}  
// End class3.cs  
</pre>the classes Class2 and Class3 each contain calls to the conditional method Class1.F, which is conditional based on whether or not DEBUG is defined. Since this symbol is defined in the context of Class2 but not Class3, the call to F in Class2 is included, while the call to F in Class3 is omitted. end example]</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 use of conditional methods in an inheritance chain can be confusing.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P5S2"></a>Calls made to a conditional method through base, of the form base.M, are subject to the normal conditional method call rules.</span> </span><span class="paragraph"><span class="example">[Example: In the example <pre class="code-example">
// Begin class1.cs  
using System;  
using System.Diagnostics;  
class Class1   
{  
   [Conditional("DEBUG")]  
   public virtual void M() {  
      Console.WriteLine("Class1.M executed");  
   }  
}  
// End class1.cs  

// Begin class2.cs  
using System;  
class Class2: Class1  
{  
   public override void M() {  
      Console.WriteLine("Class2.M executed");  
      base.M();       // base.M is not called!  
   }  
}  
// End class2.cs  

// Begin class3.cs  
#define DEBUG  
using System;  
class Class3  
{  
   public static void Test() {  
      Class2 c = new Class2();  
      c.M();              // M is called  
   }  
}  
// End class3.cs  
</pre></span></span><span class="paragraph"><span class="example">Class2 includes a call to the M defined in its base class. This call is omitted because the base method is conditional based on the presence of the symbol DEBUG, which is undefined. Thus, the method writes to the console "Class2.M executed" only. Judicious use of <span class="non-terminal"><a href="9.5.3.htm#pp-declaration">pp-declaration</a></span>s can eliminate such problems. 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 + -