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

📄 15.8.4.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="15.8.3.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="15.9.htm"><img src="next.gif" alt="next" border="0" /></a></span><span class="clause-depth"><a href="14.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="16.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="15.htm">15</a></span><span class="clause-title-previous"> Statements</span></span><span class="clause-depth"><a href="15.7.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="15.9.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="15.8.htm">15.8</a></span><span class="clause-title-previous"> Iteration statements</span></span><span class="clause-depth"><a href="15.8.3.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="15.8.4.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">15.8.4</span><span class="clause-title"> The foreach statement</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 foreach statement enumerates the elements of a collection, executing an embedded statement for each element of the collection.</span> <span class="grammar-production"><span class="name"><a name="foreach-statement"></a>foreach-statement</span> : <span class="rhs"><span class="keyword">foreach</span> <span class="terminal">(</span> <span class="non-terminal"><a href="11.htm#type">type</a></span> <span class="non-terminal"><a href="9.4.2.htm#identifier">identifier</a></span> <span class="keyword">in</span> <span class="non-terminal"><a href="14.14.htm#expression">expression</a></span> <span class="terminal">)</span> <span class="non-terminal"><a href="15.htm#embedded-statement">embedded-statement</a></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>The type and identifier of a foreach statement declare the iteration variable of the statement.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P2S2"></a>The iteration variable corresponds to a read-only local variable with a scope that extends over the embedded statement.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P2S3"></a>During execution of a foreach statement, the iteration variable represents the collection element for which an iteration is currently being performed.</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P2S4"></a>A compile-time error occurs if the embedded statement attempts to modify the iteration variable (via assignment or the ++ and  --operators) or pass the iteration variable as a ref or out parameter.</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 type of the expression of a foreach statement must be a collection type (as defined below), and an explicit conversion (<a href="13.2.htm">&#167;13.2</a>) must exist from the element type of the collection to the type of the iteration variable.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P3S2"></a>If expression has the value null, a System.NullReferenceException is thrown.</span> </span><span class="locator">
     Paragraph 4</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P4S1"></a>A type C is said to be a collection type if it implements the System.IEnumerable interface or implements the collection pattern by meeting all of the following criteria: </span><ul><li><span class="sentence"><span class="sentence-number">2</span> <a name="P4S2"></a> C contains a public instance method with the signature GetEnumerator(), that returns a <span class="non-terminal"><a href="11.1.htm#struct-type">struct-type</a></span>, <span class="non-terminal"><a href="11.2.htm#class-type">class-type</a></span>, or <span class="non-terminal"><a href="11.2.htm#interface-type">interface-type</a></span>, which is called E in the following text.</span> </li><li><span class="sentence"><span class="sentence-number">3</span> <a name="P4S3"></a> E contains a public instance method with the signature MoveNext() and the return type <span class="keyword">bool</span>.</span> </li><li><span class="sentence"><span class="sentence-number">4</span> <a name="P4S4"></a> E contains a public instance property named Current that permits reading the current value.</span> <span class="sentence"><span class="sentence-number">5</span> <a name="P4S5"></a>The type of this property is said to be the element type of the collection type.</span> </li></ul></span><span class="locator">
     Paragraph 5</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P5S1"></a>A type that implements IEnumerable is also a collection type, even if it doesn't satisfy the conditions above.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P5S2"></a>(This is possible if it implements IEnumerable via private interface implementation.)</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 System.Array type (<a href="19.1.1.htm">&#167;19.1.1</a>) is a collection type, and since all array types derive from System.Array, any array type expression is permitted in a foreach statement.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P6S2"></a>The order in which foreach traverses the elements of an array is as follows: For single-dimensional arrays elements are traversed in increasing index order, starting with index 0 and ending with index Length  -1.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P6S3"></a>For  multi-dimensional arrays, elements are traversed such that the indices of the rightmost dimension are increased first, then the next left dimension, and so on to the left.</span> </span><span class="locator">
     Paragraph 7</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P7S1"></a>A foreach statement of the form: <pre class="code-example">
foreach (ElementType element in collection) statement  
</pre>corresponds to one of two possible expansions: </span><ul><li><span class="sentence"><span class="sentence-number">2</span> <a name="P7S2"></a> If the collection expression is of a type that implements the collection pattern (as defined above), the expansion of the foreach statement is: <pre class="code-example">
Enumerator enumerator = (collection).GetEnumerator();  
try {  
   while (enumerator.MoveNext()) {  
      ElementType element = (ElementType)enumerator.Current;  
      statement;  
   }  
}  
finally {  
   IDisposable disposable = enumerator as System.IDisposable;  
   if (disposable != null) disposable.Dispose();  
}  
</pre></span></li></ul></span><span class="paragraph"><span class="note">[Note: Significant optimizations of the above are often easily available. If the type E implements System.IDisposable, then the expression (enumerator as System.IDisposable) will always be non-null and the implementation can safely substitute a simple conversion for a possibly more expensive type test. Conversely, if the type E is sealed and does not implement System.IDisposable, then the expression (enumerator as System.IDisposable) will always evaluate to null. In this case, the implementation can safely optimize away the entire finally clause. end note]</span> <ul><li><span class="sentence"><span class="sentence-number">3</span> <a name="P7S3"></a> Otherwise; the collection expression is of a type that implements System.IEnumerable, and the expansion of the foreach statement is: <pre class="code-example">
IEnumerator enumerator =  
((System.IEnumerable)(collection)).GetEnumerator();  
try {  
   while (enumerator.MoveNext()) {  
      ElementType element = (ElementType)enumerator.Current;  
      statement;  
   }  
}  
finally {  
   IDisposable disposable = enumerator as System.IDisposable;  
   if (disposable != null) disposable.Dispose();  
}  
</pre></span></li></ul></span><span class="paragraph"><span class="sentence"><span class="sentence-number">4</span> <a name="P7S4"></a>In either expansion, the enumerator variable is a temporary variable that is inaccessible in, and invisible to, the embedded statement, and the element variable is read-only in the embedded statement.</span> </span><span class="paragraph"><span class="example">[Example: The following example prints out each value in a two-dimensional array, in element order: <pre class="code-example">
using System;  
class Test  
{  
   static void Main() {  
      double[,] values = {  
         {1.2, 2.3, 3.4, 4.5},  
         {5.6, 6.7, 7.8, 8.9}  
      };  
      
      foreach (double elementValue in values)  
      Console.Write("{0} ", elementValue);  
      Console.WriteLine();  
   }  
}  
</pre></span></span><span class="paragraph"><span class="example">The output produced is as follows: <pre class="code-example">
1.2 2.3 3.4 4.5 5.6 6.7 7.8 8.9  
</pre>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 + -