powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / События в C#. Можно как-то короче писать "if(a) a()"?
8 сообщений из 8, страница 1 из 1
События в C#. Можно как-то короче писать "if(a) a()"?
    #39315036
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня в классе несколько событий. Каждое из которых вызывается в нескольких местах этого класса.
Постоянно пишу эту проверку на !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
События в C#. Можно как-то короче писать "if(a) a()"?
    #39315038
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
События в C#. Можно как-то короче писать "if(a) a()"?
    #39315039
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weyland,

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

Код: c#
1.
2.
3.
4.
5.
6.
void lalala(...)
{
    ...
    SmthChanged?.Invoke(this, EventArgs.Empty);
    ...
}
...
Рейтинг: 0 / 0
События в C#. Можно как-то короче писать "if(a) a()"?
    #39315040
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
События в C#. Можно как-то короче писать "if(a) a()"?
    #39315041
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttCharles Weyland,

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

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



Офигеть!))) Блин, надо обновлять студию!
...
Рейтинг: 0 / 0
События в C#. Можно как-то короче писать "if(a) a()"?
    #39315046
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weyland,
если память не изменяет, ( давно не писал на с# - стал забывать)
так если событие инициализировать пустой фуйней = {};
то можно вызывать без проверки..
...
Рейтинг: 0 / 0
События в C#. Можно как-то короче писать "if(a) a()"?
    #39315076
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
События в C#. Можно как-то короче писать "if(a) a()"?
    #39315105
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / События в C#. Можно как-то короче писать "if(a) a()"?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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