Tema: Re: C# vevent/delegate????
Autorius: AndriusF
Data: 2012-07-25 08:45:47
grubiai tariant delegatas leidzia metoda naudoti kaip reiksme, t.y. perduoti 
per parameterus i kita metoda, grazinti (return) is metodo ir t.t. delegatai 
yra type-safe, t.y. jie turi atitikti signatura metodo i kuri jie 
reprezentuos.
Eventai yra tiesiog palengvinimas programuotojui, compileris tai pavercia 
combine/remove delegate operacijas.
pvz is Jeffrey Richter "CLR via C#" knygos

public event EventHandler<NewMailEventArgs> NewMail;

When the C# compiler compiles the line above, it translates this single line 
of source code
into the following three constructs:


// 1. A PRIVATE delegate field that is initialized to null
private EventHandler<NewMailEventArgs> NewMail = null;
// 2. A PUBLIC add_Xxx method (where Xxx is the Event name)
// Allows methods to register interest in the event.
public void add_NewMail(EventHandler<NewMailEventArgs> value) {
// The loop and the call to CompareExchange is all just a fancy way
// of adding a delegate to the event in a thread-safe way
EventHandler<NewMailEventArgs>prevHandler;
EventHandler<NewMailEventArgs> newMail = this.NewMail;
do {
prevHandler = newMail;
EventHandler<NewMailEventArgs>newHandler =
(EventHandler<NewMailEventArgs>) Delegate.Combine(prevHandler, value);
newMail = Interlocked.CompareExchange<EventHandler<NewMailEventArgs>>(
ref this.NewMail, newHandler, prevHandler);
} while (newMail != prevHandler);
}
// 3. A PUBLIC remove_Xxx method (where Xxx is the Event name)
// Allows methods to unregister interest in the event.
public void remove_NewMail(EventHandler<NewMailEventArgs> value) {
// The loop and the call to CompareExchange is all just a fancy way
// of removing a delegate from the event in a thread-safe way
EventHandler<NewMailEventArgs> prevHandler;
EventHandler<NewMailEventArgs> newMail = this.NewMail;
do {
prevHandler = newMail;
EventHandler<NewMailEventArgs> newHandler =
(EventHandler<NewMailEventArgs>) Delegate.Remove(prevHandler, value);
newMail = Interlocked.CompareExchange<EventHandler<NewMailEventArgs>>(
ref this.NewMail, newHandler, prevHandler);
} while (newMail != prevHandler);
}


"Dziedukas" <dejau@gmail.com> wrote in message 
news:jumij5$qv8$1@trimpas.omnitel.net...
> ECMA atsisiunciau - reikes paskaityti. O kuo tie eventai skiriasi nuo 
> metodo? Nes aprasant (deleguojant) nurodoma ir gautine reiksme (void, int, 
> ..). Cia gal kazkas panasaus i interfeisa?? Ta prasme, kad naudojamas kaip 
> sablonas?? Tik ar is jo galima ka isvesti tai nezinau.
> "AndriusF" <MORESPAMandriusFL@gmail.com> wrote in message 
> news:julsna$4mv$1@trimpas.omnitel.net...
>> Eventas yra klases narys,taip kaip metodas, property ar field`as.
>> delegate yra tipas (nuoroda i metoda)
>> Eventas gali buti tik deleagte tipo.
>>
>> Siulau pasiskaityti  ECMA-334 skyrius 8.7.5 ir 17.7.
>>
>> An event is a member that enables an object or class to provide 
>> notifications. A class defines an event by
>> providing an event declaration (which resembles a field declaration, 
>> though with an added event keyword)
>> and an optional set of event accessors. The type of this declaration 
>> shall be a delegate type.
>>
>> a.
>>
>>
>> "Dziedukas" <dejau@gmail.com> wrote in message 
>> news:julek0$l2f$1@trimpas.omnitel.net...
>>> Sveiki,
>>>
>>> bandau toliau mokytis C# ir susiduriau su event'ais. Mokausi is anglisku 
>>> knygu ir kazkaip ar galva perkaito, ar kas pasidare, niekaip neikertu.
>>> Gal kas galetumet paaiskint?
>>>
>>> Dekui
>>>
>>
>>
>
>