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

📄 10.9.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="10.8.1.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="10.10.htm"><img src="next.gif" alt="next" border="0" /></a></span><span class="clause-depth"><a href="9.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="11.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="10.htm">10</a></span><span class="clause-title-previous"> Basic concepts</span></span><span class="clause-depth"><a href="10.8.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="10.10.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">10.9</span><span class="clause-title"> Automatic memory management</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# employs automatic memory management, which frees developers from manually allocating and freeing the memory occupied by objects.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P1S2"></a>Automatic memory management policies are implemented by a garbage collector.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P1S3"></a>The memory management life cycle of an object is as follows: </span></span><span class="paragraph"><span class="sentence"><span class="sentence-number">4</span> <a name="P1S4"></a>1 When the object is created, memory is allocated for it, the constructor is run, and the object is considered live.</span> </span><span class="paragraph"><span class="sentence"><span class="sentence-number">5</span> <a name="P1S5"></a>2 If the object, or any part of it, cannot be accessed by any possible continuation of execution, other than the running of destructors, the object is considered no longer in use, and it becomes eligible for destruction.</span> <span class="note">[Note: Implementations may choose to analyze code to determine which references to an object may be used in the future. For instance, if a local variable that is in scope is the only existing reference to an object, but that local variable is never referred to in any possible continuation of execution from the current execution point in the procedure, an implementation may (but is not required to) treat the object as no longer in use. end note]</span> </span><span class="paragraph"><span class="sentence"><span class="sentence-number">6</span> <a name="P1S6"></a>3 Once the object is eligible for destruction, at some unspecified later time the destructor (<a href="17.12.htm">&#167;17.12</a>) (if any) for the object is run.</span> <span class="sentence"><span class="sentence-number">7</span> <a name="P1S7"></a>Unless overridden by explicit calls, the destructor for the object is run once only.</span> </span><span class="paragraph"><span class="sentence"><span class="sentence-number">8</span> <a name="P1S8"></a>4 Once the destructor for an object is run, if that object, or any part of it, cannot be accessed by any possible continuation of execution, including the running of destructors, the object is considered inaccessible and the object becomes eligible for collection.</span> </span><span class="paragraph"><span class="sentence"><span class="sentence-number">9</span> <a name="P1S9"></a>5 Finally, at some time after the object becomes eligible for collection, the garbage collector frees the memory associated with that object.</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 garbage collector maintains information about object usage, and uses this information to make memory management decisions, such as where in memory to locate a newly created object, when to relocate an object, and when an object is no longer in use or inaccessible.</span> </span><span class="locator">
     Paragraph 3</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P3S1"></a>Like other languages that assume the existence of a garbage collector, C# is designed so that the garbage collector may implement a wide range of memory management policies.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P3S2"></a>For instance, C# does not require that destructors be run or that objects be collected as soon as they are eligible, or that destructors be run in any particular order, or on any particular thread.</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 behavior of the garbage collector can be controlled, to some degree, via static methods on the class System.GC.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P4S2"></a>This class can be used to request a collection to occur, destructors to be run (or not run), and so forth.</span> </span><span class="paragraph"><span class="example">[Example: Since the garbage collector is allowed wide latitude in deciding when to collect objects and run destructors, a conforming implementation may produce output that differs from that shown by the following code. The program <pre class="code-example">
using System;  
class A  
{  
   ~A() {  
      Console.WriteLine("Destruct instance of A");  
   }  
}  
class B  
{  
   object Ref;  
   public B(object o) {  
      Ref = o;  
   }  
   ~B() {  
      Console.WriteLine("Destruct instance of B");  
   }  
}  
class Test  
{  
   static void Main() {  
      B b = new B(new A());  
      b = null;  
      GC.Collect();  
      GC.WaitForPendingFinalizers();  
   }  
}  
</pre>creates an instance of class A and an instance of class B. These objects become eligible for garbage collection when the variable b is assigned the value null, since after this time it is impossible for any  user-written code to access them. The output could be either <pre class="code-example">
Destruct instance of A  
Destruct instance of B  
</pre>or <pre class="code-example">
Destruct instance of B  
Destruct instance of A  
</pre>because the language imposes no constraints on the order in which objects are garbage collected. </span></span><span class="paragraph"><span class="example">In subtle cases, the distinction between "eligible for destruction" and "eligible for collection" can be important. For example, <pre class="code-example">
using System;  
class A  
{  
   ~A() {  
      Console.WriteLine("Destruct instance of A");  
   }  
   public void F() {  
      Console.WriteLine("A.F");  
      Test.RefA = this;  
   }  
}  
class B  
{  
   public A Ref;  
   ~B() {  
      Console.WriteLine("Destruct instance of B");  
      Ref.F();  
   }  
}  
class Test  
{  
   public static A RefA;  
   public static B RefB;  
   static void Main() {  
      RefB = new B();  
      RefA = new A();  
      RefB.Ref = RefA;  
      RefB = null;  
      RefA = null;  
      // A and B now eligible for destruction  
      GC.Collect();  
      GC.WaitForPendingFinalizers();  
      // B now eligible for collection, but A is not  
      if (RefA != null)  
      Console.WriteLine("RefA is not null");  
   }  
}  
</pre></span></span><span class="paragraph"><span class="example">In the above program, if the garbage collector chooses to run the destructor of A before the destructor of B, then the output of this program might be: <pre class="code-example">
Destruct instance of A  
Destruct instance of B  
A.F  
RefA is not null  
</pre></span></span><span class="paragraph"><span class="example">Note that although the instance of A was not in use and A's destructor was run, it is still possible for methods of A (in this case, F) to be called from another destructor. Also, note that running of a destructor may cause an object to become usable from the mainline program again. In this case, the running of B's destructor caused an instance of A that was previously not in use to become accessible from the live reference RefA. After the call to WaitForPendingFinalizers, the instance of B is eligible for collection, but the instance of A is not, because of the reference RefA. </span></span><span class="paragraph"><span class="example">To avoid confusion and unexpected behavior, it is generally a good idea for destructors to only perform cleanup on data stored in their object's own fields, and not to perform any actions on referenced objects or static fields. 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 + -