17.7.2.htm
来自「This ECMA Standard specifies the form an」· HTM 代码 · 共 36 行
HTM
36 行
<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.7.1.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="17.7.3.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.6.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="17.8.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="17.7.htm">17.7</a></span><span class="clause-title-previous"> Events</span></span><span class="clause-depth"><a href="17.7.1.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="17.7.3.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">17.7.2</span><span class="clause-title"> Event accessors</span></span><span class="locator">
Paragraph 1</span><span class="paragraph"><span class="note">[Note: Event declarations typically omit <span class="non-terminal"><a href="17.7.htm#event-accessor-declarations">event-accessor-declarations</a></span>, as in the Button example above. One situation for doing so involves the case in which the storage cost of one field per event is not acceptable. In such cases, a class can include <span class="non-terminal"><a href="17.7.htm#event-accessor-declarations">event-accessor-declarations</a></span> and use a private mechanism for storing the list of event handlers. Similarly, in cases where the handling of an event requires access to external resources, event accessors may be used to manage these resources. end note]</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 <span class="non-terminal"><a href="17.7.htm#event-accessor-declarations">event-accessor-declarations</a></span> of an event specify the executable statements associated with adding and removing event handlers.</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 accessor declarations consist of an <span class="non-terminal"><a href="17.7.htm#add-accessor-declaration">add-accessor-declaration</a></span> and a <span class="non-terminal"><a href="17.7.htm#remove-accessor-declaration">remove-accessor-declaration</a></span>.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P3S2"></a>Each accessor declaration consists of the token add or remove followed by a block.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P3S3"></a>The block associated with an <span class="non-terminal"><a href="17.7.htm#add-accessor-declaration">add-accessor-declaration</a></span> specifies the statements to execute when an event handler is added, and the block associated with a <span class="non-terminal"><a href="17.7.htm#remove-accessor-declaration">remove-accessor-declaration</a></span> specifies the statements to execute when an event handler is removed.</span> </span><span class="locator">
Paragraph 4</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P4S1"></a>Each <span class="non-terminal"><a href="17.7.htm#add-accessor-declaration">add-accessor-declaration</a></span> and <span class="non-terminal"><a href="17.7.htm#remove-accessor-declaration">remove-accessor-declaration</a></span> corresponds to a method with a single value parameter of the event type, and a <span class="keyword">void</span> return type.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P4S2"></a>The implicit parameter of an event accessor is named value.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P4S3"></a>When an event is used in an event assignment, the appropriate event accessor is used.</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P4S4"></a>Specifically, if the assignment operator is += then the add accessor is used, and if the assignment operator is -= then the remove accessor is used.</span> <span class="sentence"><span class="sentence-number">5</span> <a name="P4S5"></a>In either case, the right-hand operand of the assignment operator is used as the argument to the event accessor.</span> <span class="sentence"><span class="sentence-number">6</span> <a name="P4S6"></a>The block of an <span class="non-terminal"><a href="17.7.htm#add-accessor-declaration">add-accessor-declaration</a></span> or a <span class="non-terminal"><a href="17.7.htm#remove-accessor-declaration">remove-accessor-declaration</a></span> must conform to the rules for <span class="keyword">void</span> methods described in <a href="17.5.8.htm">§17.5.8</a>.</span> <span class="sentence"><span class="sentence-number">7</span> <a name="P4S7"></a>In particular, return statements in such a block are not permitted to specify an expression.</span> </span><span class="locator">
Paragraph 5</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P5S1"></a>Since an event accessor implicitly has a parameter named value, it is a compile-time error for a local variable declared in an event accessor to have that name.</span> </span><span class="paragraph"><span class="example">[Example: In the example <pre class="code-example">
class Control: Component
{
// Unique keys for events
static readonly object mouseDownEventKey = new object();
static readonly object mouseUpEventKey = new object();
// Return event handler associated with key
protected Delegate GetEventHandler(object key) {...}
// Add event handler associated with key
protected void AddEventHandler(object key, Delegate handler) {...}
// Remove event handler associated with key
protected void RemoveEventHandler(object key, Delegate handler) {...}
// MouseDown event
public event MouseEventHandler MouseDown {
add { AddEventHandler(mouseDownEventKey, value); }
remove { RemoveEventHandler(mouseDownEventKey, value); }
}
// MouseUp event
public event MouseEventHandler MouseUp {
add { AddEventHandler(mouseUpEventKey, value); }
remove { RemoveEventHandler(mouseUpEventKey, value); }
}
// Invoke the MouseUp event
protected void OnMouseUp(MouseEventArgs args) {
MouseEventHandler handler;
handler = (MouseEventHandler)GetEventHandler(mouseUpEventKey);
if (handler != null)
handler(this, args);
}
}
</pre>the Control class implements an internal storage mechanism for events. The AddEventHandler method associates a delegate value with a key, the GetEventHandler method returns the delegate currently associated with a key, and the RemoveEventHandler method removes a delegate as an event handler for the specified event. Presumably, the underlying storage mechanism is designed such that there is no cost for associating a null delegate value with a key, and thus unhandled events consume no storage. 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 + -
显示快捷键?