Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/40: Рейтинг темы: голосов - 40, средняя оценка - 4.50
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,325

Синтаксис ?.Invoke()

23.10.2017, 09:28. Показов 7998. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, как можно интерпретировать этот синтаксис ?

C#
1
 this.ObjectChanged?.Invoke()
И как можно было бы эту строку записать иначе?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.10.2017, 09:28
Ответы с готовыми решениями:

Dispatcher.Invoke и delegate invoke, исправить ошибки в коде
привет не пойму почему второй код не работает? void bw_DoWork(object sender, DoWorkEventArgs e) { NextDel nd =...

Invoke
Не очень хорошо разбираюсь в этом, поэтому спрашиваю. Есть программа на WinForms. В MainForm есть такая строчка: Invoke(new...

invoke
День добрый.помогите разобраться плиз имеется 2 формы. в 1ой (назовем ее main) происходит создание нового потока и запуск в нем 2ой...

8
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
23.10.2017, 09:55
Лучший ответ Сообщение было отмечено UseMuse как решение

Решение

UseMuse, Это оператор условного null, появился в C#6.0.
По другому:
C#
1
2
if(this.ObjectChanged != null)
   this.ObjectChanged.Invoke();
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
23.10.2017, 10:04
UseMuse, ?. это т.к. называемый Элвис оператор для проверки на null. Аналогом будет такая запись:
C#
1
2
var temp = this.ObjectChanged;
if (temp != null) temp();
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.10.2017, 14:43
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Аналогом будет такая запись
Частичным аналогом.
Полного аналога — с захватом значения, насколько мне известно, в языке нет.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
23.10.2017, 14:59
kolorotur, декомпилятор показывает именно такой код с временной переменной. Какой еще другой захват значения существует?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.10.2017, 15:16
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Какой еще другой захват значения существует?
Если этот оператор используется со значимыми типами (например, через универсальный метод без ограничения на ссылочные типы) для вызова мутирующего метода, то приведенный аналог мутирует копию, а не изначальное значение, как это делает оператор ?..
Что-то вроде этого:
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
25
26
27
28
29
30
struct Foo : IDisposable
{
    public bool Disposed { get; private set; }
 
    public void Dispose()
    {
        Disposed = true;
    }
}
 
void Dispose1<T>(ref T v) where T : IDisposable
{
    v?.Dispose();
}
 
void Dispose2<T>(ref T v) where T : IDisposable
{
   T t = v;
   if (t != null)
      t.Dispose();
}
 
var foo1 = new Foo();
var foo2 = new Foo();
 
Dispose1(ref foo1);
Dispose2(ref foo2);
 
Console.WriteLine(foo1.Disposed); // True.
Console.WriteLine(foo2.Disposed); // False.
5
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
23.10.2017, 16:52
kolorotur, тогда разве не получается, что аналогом будет:
C#
1
2
3
4
5
void Dispose2<T>(ref T v) where T : IDisposable
{
   if (v != null)
      v.Dispose();
}
?

Добавлено через 4 минуты
Вернее так:
C#
1
2
 if ((object)v != null)
      // что-то делать с v
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
23.10.2017, 17:13
kolorotur, спасибо за пример. Я думал немного в другом направлении. В данном случае речь идет о событии или делегате - то есть гарантировано ссылочному типу. Что касается значимых типов, то компилятор может просто убирать проверку на null и сразу делать обращение к члену т.к. значимый тип никогда не равен null.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.10.2017, 18:17
woldemas, нет, потому что в обоих случаях переменная v считывается более одного раза. Если оператор ?. будет разворачиваться во множественное считывание переменной, то между считываниями ей может быть присвоено значение null, что приведет к вылету NullReferenceException, что в свою очередь похерит весь смысл существования оператора ?.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
компилятор может просто убирать проверку на null и сразу делать обращение к члену
Да, но вряд ли он будет убирать создание временной переменной и присваивание ей значения.
По вашей наводке глянул на декомпилированный метод выше, получилось такое (ILSpy):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private unsafe static void Dispose1<T>(ref T v) where T : IDisposable
{
    T* arg_25_0 = ref v;
    T t = default(T);
    if (t == null)
    {
        t = v;
        arg_25_0 = ref t;
        if (t == null)
        {
            return;
        }
    }
    arg_25_0.Dispose();
}
С одной стороны, в шарпе нельзя создавать указатели на любые управляемые типы (но рантайм может), потому этот код и не скомпилируется.
С другой стороны, не очевидны причины для жонглирования с указателями, ведь без указателей метод можно переписать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static void Dispose2<T>(ref T v) where T : IDisposable
{
    T t = default(T);
    if (t == null) // T — ссылочный тип
    {
        t = v;  // Локальная копия
        if (t != null)
            t.Dispose();
    }
        else
    {
        v.Dispose();
    }
}
Внешне вроде бы все то же самое: переменная v при любом пути выполнения считывается только раз, если Т — ссылочный тип, то создается локальная копия и проверяется на null, если нет, то сразу вызывается нужный метод.
Результат будет таким же, как при использовании оператора ?.. То есть полный аналог в языке все-таки есть

Однако, я не считаю себя умнее разработчиков шарпа, потому наверняка есть какие-то причины реализовать этот оператор именно так, а не иначе. Ну не для того же, чтобы делать ровно один вызов в конце метода?
Может, кто-нибудь придумает сценарии, при которых эти две реализации будут работать по-разному?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.10.2017, 18:17
Помогаю со студенческими работами здесь

Invoke и многопоточность
Здравствуйте. В классе есть три списка. В эти списки я хочу параллельно читать данные из трех таблиц бд. Я создаю три потока в этом же...

Invoke и новый поток
Пытаюсь запустить поток, в котором будут изменяться свойства listview. Но судя по зависаниям программы, у меня это не получилось. Вот что я...

Быстродействие потока, Invoke
добрый день, задача следующая, обрабатываю изображение, что бы форма не зависала, делаю в отдельном потоке. И я заметил что в новом потоке...

Не срабатывает делегат и метод Invoke
Добрый день всем. Товарищи такая беда, сообразить не могу поэтому прошу вашей помощи. Есть метод в котором выполняется поток public...

Отсутствует определение Invoke и InvokeRequired
Здравствуйте! :( Вопрос такой: сделал маленькую программу в 1 форму с применением потоков, всё работает отлично. в 1 проге: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru