📄 17.11.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="17.10.6.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="17.12.htm"><img src="next.gif" alt="next" border="0" /></a></span><span class="clause-depth"><a href="16.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="18.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="17.htm">17</a></span><span class="clause-title-previous"> Classes</span></span><span class="clause-depth"><a href="17.10.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="17.12.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">17.11</span><span class="clause-title"> Static constructors</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 static constructor is a member that implements the actions required to initialize a class.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P1S2"></a>Static constructors are declared using static-constructor-declarations: <span class="grammar-production"><span class="name"><a name="static-constructor-declaration"></a>static-constructor-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="17.11.htm#static-constructor-modifiers">static-constructor-modifiers</a></span> <span class="non-terminal"><a href="9.4.2.htm#identifier">identifier</a></span> <span class="terminal">(</span> <span class="terminal">)</span> <span class="non-terminal"><a href="17.11.htm#static-constructor-body">static-constructor-body</a></span> </span></span><span class="grammar-production"><span class="name"><a name="static-constructor-modifiers"></a>static-constructor-modifiers</span> : <span class="rhs"><span class="keyword">extern</span><sub>opt</sub> <span class="keyword">static</span> </span><span class="rhs"><span class="keyword">static</span> <span class="keyword">extern</span><sub>opt</sub> </span></span><span class="grammar-production"><span class="name"><a name="static-constructor-body"></a>static-constructor-body</span> : <span class="rhs"><span class="non-terminal"><a href="15.2.htm#block">block</a></span> </span><span class="rhs"><span class="terminal">;</span> </span></span></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 <span class="non-terminal"><a href="17.11.htm#static-constructor-declaration">static-constructor-declaration</a></span> may include a set of attributes (<a href="24.htm">§24</a>) and an extern modifier (<a href="17.5.7.htm">§17.5.7</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 identifier of a <span class="non-terminal"><a href="17.11.htm#static-constructor-declaration">static-constructor-declaration</a></span> must name the class in which the static constructor is declared.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P3S2"></a>If any other name is specified, a compile-time error occurs.</span> </span><span class="locator">
Paragraph 4</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P4S1"></a>When a static constructor declaration includes an extern modifier, the static constructor is said to be an external static constructor.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P4S2"></a>Because an external static constructor declaration provides no actual implementation, its <span class="non-terminal"><a href="17.11.htm#static-constructor-body">static-constructor-body</a></span> consists of a semicolon.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P4S3"></a>For all other static constructor declarations, the <span class="non-terminal"><a href="17.11.htm#static-constructor-body">static-constructor-body</a></span> consists of a block, which specifies the statements to execute in order to initialize the class.</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P4S4"></a>This corresponds exactly to the <span class="non-terminal"><a href="17.5.htm#method-body">method-body</a></span> of a static method with a <span class="keyword">void</span> return type (<a href="17.5.8.htm">§17.5.8</a>).</span> </span><span class="locator">
Paragraph 5</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P5S1"></a>Static constructors are not inherited, and cannot be called directly.</span> </span><span class="locator">
Paragraph 6</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P6S1"></a>The static constructor for a class executes at most once in a given application domain.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P6S2"></a>The execution of a static constructor is triggered by the first of the following events to occur within an application domain: </span><ul><li><span class="sentence"><span class="sentence-number">3</span> <a name="P6S3"></a> An instance of the class is created.</span> </li><li><span class="sentence"><span class="sentence-number">4</span> <a name="P6S4"></a> Any of the static members of the class are referenced.</span> </li></ul></span><span class="locator">
Paragraph 7</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P7S1"></a>If a class contains the Main method (<a href="10.1.htm">§10.1</a>) in which execution begins, the static constructor for that class executes before the Main method is called.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P7S2"></a>If a class contains any static fields with initializers, those initializers are executed in textual order immediately prior to executing the static constructor.</span> </span><span class="paragraph"><span class="example">[Example: The example <pre class="code-example">
using System;
class Test
{
static void Main() {
A.F();
B.F();
}
}
class A
{
static A() {
Console.WriteLine("Init A");
}
public static void F() {
Console.WriteLine("A.F");
}
}
class B
{
static B() {
Console.WriteLine("Init B");
}
public static void F() {
Console.WriteLine("B.F");
}
}
</pre>must produce the output: <pre class="code-example">
Init A
A.F
Init B
B.F
</pre>because the execution of A's static constructor is triggered by the call to A.F, and the execution of B's static constructor is triggered by the call to B.F. end example]</span> </span><span class="paragraph"><span class="sentence"><span class="sentence-number">3</span> <a name="P7S3"></a>It is possible to construct circular dependencies that allow static fields with variable initializers to be observed in their default value state.</span> </span><span class="paragraph"><span class="example">[Example: The example <pre class="code-example">
using System;
class A
{
public static int X;
static A() { X = B.Y + 1;}
}
class B
{
public static int Y = A.X + 1;
static B() {}
static void Main() {
Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);
}
}
</pre>produces the output <pre class="code-example">
X = 1, Y = 2
</pre></span></span><span class="paragraph"><span class="example">To execute the Main method, the system first runs the initializer for B.Y, prior to class B's static constructor. </span></span><span class="paragraph"><span class="example">Y's initializer causes A's static constructor to be run because the value of A.X is referenced. The static constructor of A in turn proceeds to compute the value of X, and in doing so fetches the default value of Y, which is zero. A.X is thus initialized to 1. The process of running A's static field initializers and static constructor then completes, returning to the calculation of the initial value of Y, the result of which becomes 2. 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 + -