Есть ли оператор с нулевым условием, например, для событий .. Кнопка? .Click + = (ss, ee) - PullRequest
0 голосов
/ 10 ноября 2019

Почему для событий нет нулевого условного оператора?

Например, у меня есть следующий код, который вызывает событие, если объект не нулевой:

Button TargetButton =  null;

    if(IsRunning)
    {
       TargetButton = new ....
    }

TargetButton?.Click +=(ss,ee)=>{...}

// Compile-time error 
// The event 'EditorButton.Click' can only appear on the left hand side of += or -= 

кратко:

есть альтернатива? чем с помощью обычного if(TargetButton != null ) ... raise event

Почему для события нет нуль-условного оператора. и принять ноль? http://prntscr.com/pv1inc

Ответы [ 2 ]

2 голосов
/ 10 ноября 2019

Проблема не связана с событиями.

Оператор с нулевым условием должен остановить оценку, если ссылка нулевая.

Это не применимо в левой или правой частиприсваивание.

Если у вас есть:

public class Test
{
  public int Value;
  public void Method() { }
}

Вы не можете написать:

Test v;

v?.Value = 10;

int a = v?.Value;

Потому что, если v равно нулю, v.Value не оценивается.

  • Так что же делать с = 10?

  • Или что делать с a?

Таким образом, то же самое происходит при добавлении или удалении обработчика события в переменную события, которая пуста, когда пуста.

C # событие равно нулю

Следовательно,ошибка компилятора, запрещающая такие записи.

Вот почему вы не можете написать:

TargetButton?.Click +=(ss,ee)=>{...}

Потому что что делать с (ss,ee)=>{...}, если TargetButton равно нулю?

Можно сказать, что вы хотите, чтобы компилятор игнорировал это.

Но компилятор не допускает таких нечистых действий.

Мы можем написать следующее:

v?.Test();

Здесьis v is null метод не вызывается, и все в порядке, потому что нет ничего правильного или левого, с которым компилятор не знает, что делать.

int a = v?.Value ?? 0;

Здесь, если v равно нулю, используется 0.

Нулевые операторы? и? []

Нулевые коалесцирующие операторы ?? и ?? =

0 голосов
/ 10 ноября 2019

События - это немного больше, чем аксессоры Add () и Remove (), обернутые вокруг делегата. Однако то, что может немного сбивать с толку, заключается в том, что код класса может получить к нему полный доступ (чтение, обнуление и т. Д.) Под именем события.

Способ их вызова выглядит следующим образом. Я взял пример из INotifyPropertyChanged:

//Declaring the event
public event PropertyChangedEventHandler PropertyChanged;  

//the function that raises the Events.
private void NotifyPropertyChanged(
//That attribute is almost unique for the function of NotifyPropertyChange
//It puts in teh propertyName if nothing is given
//You just use normal paramters here
[CallerMemberName] String propertyName = "")  
{  
    //Nullcheck, Invoke with EventArgs containing the propertyName
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}  

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

//volatile so Optimisations will not cut it out
volatile var localCopy = PropertyChanged
...