Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / События в C#. Можно как-то короче писать "if(a) a()"? / 8 сообщений из 8, страница 1 из 1
25.09.2016, 05:41
    #39315036
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в C#. Можно как-то короче писать "if(a) a()"?
У меня в классе несколько событий. Каждое из которых вызывается в нескольких местах этого класса.
Постоянно пишу эту проверку на !null и одни и те же аргументы:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public event EventHandler SmthChanged;
void lalala(...)
{
    ...
    if (SmthChanged != null) SmthChanged(this, EventArgs.Empty);
    ...
}
void Text(...)
    ...
    if (SmthChanged != null) SmthChanged(this, EventArgs.Empty);
    ...
}



Мне несколько раз говорили, то пишу код как начинающий. Как профи пишут? Они то ли эту проверку в другое место пихают, то ли ещё что-то делают..
Пытался найти статейки на тему "как выглядит код работы с событиями у профессионалов" или "как грамотно работать с событиями" - да не нашёл. Если кто скинет ссылку полезную - будет здорово!
...
Рейтинг: 0 / 0
25.09.2016, 05:58
    #39315038
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в C#. Можно как-то короче писать "if(a) a()"?
Charles Weyland,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public event EventHandler SmthChanged;

public void RaiseSmthChanged()
{
    // защитимся от неожиданностей из параллельных потоков
    var smthChanged = this.SmthChanged;
    // проверим на null
    if (smthChanged != null) {
       // вызовем событие
       smthChanged(this, EventArgs.Empty);
    }
}

void lalala(...)
{
    ...
    RaiseSmthChanged();
    ...
}
void Text(...)
    ...
    RaiseSmthChanged();
    ...
}
...
Рейтинг: 0 / 0
25.09.2016, 06:00
    #39315039
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в C#. Можно как-то короче писать "if(a) a()"?
Charles Weyland,

в c# 6 ещё можно так

Код: c#
1.
2.
3.
4.
5.
6.
void lalala(...)
{
    ...
    SmthChanged?.Invoke(this, EventArgs.Empty);
    ...
}
...
Рейтинг: 0 / 0
25.09.2016, 06:18
    #39315040
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в C#. Можно как-то короче писать "if(a) a()"?
Про доп.проверку огромное спасибо, не учёл, мог напороться в дальнейшем использовании объекта.

Ещё вопрос в тему - в дочернем классе не могу подписаться на событие базового класса.

Есть заголовок
Код: c#
1.
2.
3.
4.
    protected class DataHeader
    {
        protected event EventHandler<MDHeaderEventArgs> Added;
    }


А в наследуемых классах не удаётся подписаться на это событие
Код: c#
1.
2.
3.
4.
    public class MDCell: DataHeader
    {
        Added += ...??
    }


Сдаётся мне, сказывается нехватка знаний по делегатам.. штудирую статью . Но если подскажете, информация будет полезной.
...
Рейтинг: 0 / 0
25.09.2016, 06:19
    #39315041
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в C#. Можно как-то короче писать "if(a) a()"?
hVosttCharles Weyland,

в c# 6 ещё можно так

Код: c#
1.
2.
3.
4.
5.
6.
void lalala(...)
{
    ...
    SmthChanged?.Invoke(this, EventArgs.Empty);
    ...
}



Офигеть!))) Блин, надо обновлять студию!
...
Рейтинг: 0 / 0
25.09.2016, 08:30
    #39315046
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в C#. Можно как-то короче писать "if(a) a()"?
Charles Weyland,
если память не изменяет, ( давно не писал на с# - стал забывать)
так если событие инициализировать пустой фуйней = {};
то можно вызывать без проверки..
...
Рейтинг: 0 / 0
25.09.2016, 11:40
    #39315076
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в C#. Можно как-то короче писать "if(a) a()"?
Charles Weyland,

Еще раз. Русским по белому. Читайте Рихтера. Там всё это расписано:
Chapter 11 Events, Part Designing A Type That Exposed an Event, Step#3 Define a method responsible for raising the event to
notify registered objects that the event has occurred
Код: c#
1.
2.
3.
4.
5.
// Version 2
protected virtual void OnNewMail(NewMailEventArgs e) {
  EventHandler<NewMailEventArgs> temp = NewMail;
  if (temp != null) temp(this, e);
}


The thinking here is that a reference to NewMail is copied into a temporary variable, temp,
which refers to the chain of delegates at the moment the assignment is performed. Now, this
method compares temp and null and invokes temp, so it doesn’t matter if another thread
changes NewMail
after the assignment to temp. Remember that delegates are immutable and
this is why this technique works in theory. However, what a lot of developers don’t realize is that
this code could be optimized by the compiler to remove the local temp variable entirely. If this
happens, this version of the code is identical to the first version, so a NullReferenceException
is still possible.
To really fix this code, you should rewrite OnNewMail like the following.
Код: c#
1.
2.
3.
4.
5.
// Version 3
protected virtual void OnNewMail(NewMailEventArgs e) {
  EventHandler<NewMailEventArgs> temp = Volatile.Read(ref NewMail);
  if (temp != null) temp(this, e);
}
...
Рейтинг: 0 / 0
25.09.2016, 14:52
    #39315105
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в C#. Можно как-то короче писать "if(a) a()"?
Charles WeylandПро доп.проверку огромное спасибо, не учёл, мог напороться в дальнейшем использовании объекта.

Ещё вопрос в тему - в дочернем классе не могу подписаться на событие базового класса.

Есть заголовок
Код: c#
1.
2.
3.
4.
    protected class DataHeader
    {
        protected event EventHandler<MDHeaderEventArgs> Added;
    }



А в наследуемых классах не удаётся подписаться на это событие
Код: c#
1.
2.
3.
4.
    public class MDCell: DataHeader
    {
        Added += ...??
    }



Сдаётся мне, сказывается нехватка знаний по делегатам.. штудирую статью . Но если подскажете, информация будет полезной.


Во я фигнищщу то сморозил, под утро пытаясь что-то запрограммировать
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / События в C#. Можно как-то короче писать "if(a) a()"? / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]