[stdlib] Как насчет макроса RaiseEvent?
От: catbert  
Дата: 19.10.11 20:21
Оценка: +1
Как известно, правильно вызывать событие надо приблизительно так:
mutable e = MyEvent;
unless (e is null) e(sender, args);


Почему бы не добавить в стандартную библиотеку макрос RaiseEvent, который делал бы за нас грязную работу?

RaiseEvent(evt, sender, args) /* -------> */ { mutable _N_100500 = evt; unless (evt is null) evt(sender, args); }


Кроме того, неплохо добавить и стандартную реализацию OnMyEvent для событий:

[Raise] public event MyEvent : Handler;

/* раскрывается в */

protected OnMyEvent(args : EventArgs) : void
{
    RaiseEvent(MyEvent, this, args);
}


Ну и для полного счастья, аксесоры с событиями:

[EventAccessor] _myField : string;

// создает свойство MyField, событие MyFieldChanged, и метод OnMyFieldChanged
Re: [stdlib] Как насчет макроса RaiseEvent?
От: xShiFT Россия  
Дата: 20.10.11 01:51
Оценка:
Здравствуйте, catbert, Вы писали:

C>Ну и для полного счастья, аксесоры с событиями:


C>
C>[EventAccessor] _myField : string;

C>// создает свойство MyField, событие MyFieldChanged, и метод OnMyFieldChanged
C>


И для совсем полного счастья


public event PropertyChanged: PropertyChangedEventHandler;
// и 
OnPropertyChanged(propertyName: string): void
Re: [stdlib] Как насчет макроса RaiseEvent?
От: WolfHound  
Дата: 20.10.11 04:41
Оценка:
Здравствуйте, catbert, Вы писали:

Напиши и положи в сниппеты.
А там видно будет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: [stdlib] Как насчет макроса RaiseEvent?
От: CodingUnit Россия  
Дата: 20.10.11 06:22
Оценка:
Здравствуйте, catbert, Вы писали:

C>Как известно, правильно вызывать событие надо приблизительно так:

C>
C>mutable e = MyEvent;
C>unless (e is null) e(sender, args);
C>


У меня в моей библиотеке есть такой макрос, который работает по этой схеме, написал его я довольно давно, можно наверное использовать его реализацию
Re[2]: [stdlib] Как насчет макроса RaiseEvent?
От: CodingUnit Россия  
Дата: 20.10.11 07:01
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>У меня в моей библиотеке есть такой макрос, который работает по этой схеме, написал его я довольно давно, можно наверное использовать его реализацию


Сам макрос лежит здесь, он правда староват, давно писал, но можно что то отрефакторить:

https://github.com/CodingUnit/CommonLib/blob/master/CommonLib/CommonLib.Nemerle/CommonLib.Macros/Events.n
Re: [stdlib] Как насчет макроса RaiseEvent?
От: hardcase Пират http://nemerle.org
Дата: 20.10.11 07:40
Оценка:
Здравствуйте, catbert, Вы писали:

C>Как известно, правильно вызывать событие надо приблизительно так:

C>
C>mutable e = MyEvent;
C>unless (e is null) e(sender, args);
C>


C>Почему бы не добавить в стандартную библиотеку макрос RaiseEvent, который делал бы за нас грязную работу?


Он не нужен:
public event E : EventHandler;


public DoE() :  void
{
  E?.Invoke(this, EventArgs.Empty);
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [stdlib] Как насчет макроса RaiseEvent?
От: catbert  
Дата: 20.10.11 11:26
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Он не нужен:


Для многопоточного кода нужна ссылка в стеке, иначе между проверкой на null-ность и вызовом Invoke может исчезнуть E.

http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspx
Re[3]: [stdlib] Как насчет макроса RaiseEvent?
От: Jack128  
Дата: 20.10.11 11:32
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, hardcase, Вы писали:


H>>Он не нужен:


C>Для многопоточного кода нужна ссылка в стеке, иначе между проверкой на null-ность и вызовом Invoke может исчезнуть E.


а (макрос?) ?. разве не на стеке ссылку сохраняет?? Если нет — то как раз "?." нужно переделывать
Re[3]: [stdlib] Как насчет макроса RaiseEvent?
От: CodingUnit Россия  
Дата: 20.10.11 11:33
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, hardcase, Вы писали:


H>>Он не нужен:


C>Для многопоточного кода нужна ссылка в стеке, иначе между проверкой на null-ность и вызовом Invoke может исчезнуть E.


Вообще hardcase прав, посмотри во что раскрывается ?. макрос, там есть ссылка в стеке, тоже самое что и если писать:
def e = evt;
when (e != null) evt(this, EventArgs.Empty);
Re[4]: [stdlib] Как насчет макроса RaiseEvent?
От: catbert  
Дата: 20.10.11 11:35
Оценка:
Здравствуйте, Jack128, Вы писали:

J>а (макрос?) ?. разве не на стеке ссылку сохраняет?? Если нет — то как раз "?." нужно переделывать


Я думал, нигде не сохраняет. Оказалось, сохраняет на стеке. Как всегда, в Немерле, если поискать, найдется всё что нужно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.