[stdlib] Как насчет макроса RaiseEvent?
Как известно, правильно вызывать событие надо приблизительно так:
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?
Здравствуйте, catbert, Вы писали:
Напиши и положи в сниппеты.
А там видно будет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: [stdlib] Как насчет макроса RaiseEvent?
Здравствуйте, catbert, Вы писали:
C>Как известно, правильно вызывать событие надо приблизительно так:
C>C>mutable e = MyEvent;
C>unless (e is null ) e(sender, args);
C>
У меня в моей библиотеке есть такой макрос, который работает по этой схеме, написал его я довольно давно, можно наверное использовать его реализацию
Re[2]: [stdlib] Как насчет макроса RaiseEvent?
Здравствуйте, CodingUnit, Вы писали:
CU>У меня в моей библиотеке есть такой макрос, который работает по этой схеме, написал его я довольно давно, можно наверное использовать его реализацию
Сам макрос лежит здесь, он правда староват, давно писал, но можно что то отрефакторить:
https://github.com/CodingUnit/CommonLib/blob/master/CommonLib/CommonLib.Nemerle/CommonLib.Macros/Events.n
Re: [stdlib] Как насчет макроса RaiseEvent?
Здравствуйте, 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?
Здравствуйте, 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>а (макрос?) ?. разве не на стеке ссылку сохраняет?? Если нет — то как раз "?." нужно переделывать
Я думал, нигде не сохраняет. Оказалось, сохраняет на стеке. Как всегда, в Немерле, если поискать, найдется всё что нужно
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить