25.1.htm
来自「This ECMA Standard specifies the form an」· HTM 代码 · 共 42 行
HTM
42 行
<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="25.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="25.2.htm"><img src="next.gif" alt="next" border="0" /></a></span><span class="clause-depth"><a href="24.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="25.htm">25</a></span><span class="clause-title-previous"> Unsafe code</span></span><span class="clause-depth"><a href="25.1.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="25.2.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">25.1</span><span class="clause-title"> Unsafe contexts</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 unsafe features of C# are available only in unsafe contexts.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P1S2"></a>An unsafe context is introduced by including an unsafe modifier in the declaration of a type or member, or by employing an unsafe-statement: </span><ul><li><span class="sentence"><span class="sentence-number">3</span> <a name="P1S3"></a> A declaration of a class, struct, interface, or delegate may include an unsafe modifier, in which case the entire textual extent of that type declaration (including the body of the class, struct, or interface) is considered an unsafe context.</span> </li><li><span class="sentence"><span class="sentence-number">4</span> <a name="P1S4"></a> A declaration of a field, method, property, event, indexer, operator, instance constructor, destructor, or static constructor may include an unsafe modifier, in which case, the entire textual extent of that member declaration is considered an unsafe context.</span> </li><li><span class="sentence"><span class="sentence-number">5</span> <a name="P1S5"></a> An <span class="non-terminal"><a href="25.1.htm#unsafe-statement">unsafe-statement</a></span> enables the use of an unsafe context within a block.</span> <span class="sentence"><span class="sentence-number">6</span> <a name="P1S6"></a>The entire textual extent of the associated block is considered an unsafe context.</span> </li></ul></span><span class="locator">
Paragraph 2</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P2S1"></a>The associated grammar extensions are shown below.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P2S2"></a>For brevity, ellipses (...) are used to represent productions that appear in preceding chapters.</span> <span class="grammar-production"><span class="name"><a name="class-modifier"></a>class-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="struct-modifier"></a>struct-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="interface-modifier"></a>interface-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="delegate-modifier"></a>delegate-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="field-modifier"></a>field-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="method-modifier"></a>method-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="property-modifier"></a>property-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="event-modifier"></a>event-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="indexer-modifier"></a>indexer-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="operator-modifier"></a>operator-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="constructor-modifier"></a>constructor-modifier</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="keyword">unsafe</span> </span></span><span class="grammar-production"><span class="name"><a name="destructor-declaration"></a>destructor-declaration</span> : <span class="rhs"><span class="non-terminal"><a href="24.2.htm#attributes">attributes</a></span><sub>opt</sub> <span class="keyword">extern</span><sub>opt</sub> <span class="keyword">unsafe</span><sub>opt</sub> <span class="terminal">~</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.12.htm#destructor-body">destructor-body</a></span> </span><span class="rhs"><span class="non-terminal"><a href="24.2.htm#attributes">attributes</a></span><sub>opt</sub> <span class="keyword">unsafe</span><sub>opt</sub> <span class="keyword">extern</span><sub>opt</sub> <span class="terminal">~</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.12.htm#destructor-body">destructor-body</a></span> </span></span><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="keyword">extern</span><sub>opt</sub> <span class="keyword">unsafe</span><sub>opt</sub> <span class="keyword">static</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 class="rhs"><span class="non-terminal"><a href="24.2.htm#attributes">attributes</a></span><sub>opt</sub> <span class="keyword">unsafe</span><sub>opt</sub> <span class="keyword">extern</span><sub>opt</sub> <span class="keyword">static</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="embedded-statement"></a>embedded-statement</span> : <span class="rhs"><span class="terminal">...</span> </span><span class="rhs"><span class="non-terminal"><a href="25.1.htm#unsafe-statement">unsafe-statement</a></span> </span></span><span class="grammar-production"><span class="name"><a name="unsafe-statement"></a>unsafe-statement</span> : <span class="rhs"><span class="keyword">unsafe</span> <span class="non-terminal"><a href="15.2.htm#block">block</a></span> </span></span></span><span class="paragraph"><span class="example">[Example: In the example <pre class="code-example">
public unsafe struct Node
{
public int Value;
public Node* Left;
public Node* Right;
}
</pre>the unsafe modifier specified in the struct declaration causes the entire textual extent of the struct declaration to become an unsafe context. Thus, it is possible to declare the Left and Right fields to be of a pointer type. The example above could also be written <pre class="code-example">
public struct Node
{
public int Value;
public unsafe Node* Left;
public unsafe Node* Right;
}
</pre></span></span><span class="paragraph"><span class="example">Here, the unsafe modifiers in the field declarations cause those declarations to be considered unsafe contexts. end example]</span> </span><span class="locator">
Paragraph 3</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P3S1"></a>Other than establishing an unsafe context, thus permitting the use of pointer types, the unsafe modifier has no effect on a type or a member.</span> <span class="example">[Example: In the example <pre class="code-example">
public class A
{
public unsafe virtual void F() {
char* p;
...
}
}
public class B: A
{
public override void F() {
base.F();
...
}
}
</pre>the unsafe modifier on the F method in A simply causes the textual extent of F to become an unsafe context in which the unsafe features of the language can be used. In the override of F in B, there is no need to re-specify the unsafe modifier-unless, of course, the F method in B itself needs access to unsafe features. </span></span><span class="paragraph"><span class="example">The situation is slightly different when a pointer type is part of the method's signature <pre class="code-example">
public unsafe class A
{
public virtual void F(char* p) {...}
}
public class B: A
{
public unsafe override void F(char* p) {...}
}
</pre></span></span><span class="paragraph"><span class="example">Here, because F's signature includes a pointer type, it can only be written in an unsafe context. However, the unsafe context can be introduced by either making the entire class unsafe, as is the case in A, or by including an unsafe modifier in the method declaration, as is the case in B. 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 + =
减小字号Ctrl + -
显示快捷键?