2014-10-07 3 views
1

Я начинаю C# и загружаю метод расширения в How do I make a DataGridView immediately commit edits? Метод отлично работает, но не понимает синтаксис.Синтаксис прилагаемого метода расширения

Мой вопрос заключается в том, чтобы задать объяснение синтаксиса на две строки.
1-я строка: gv.CurrentCellDirtyStateChanged += (sender, args) => Что такое += и => для ???
2-я строка: }; Зачем нужна точка с запятой?

public static void ChangeEditModeToOnPropertyChanged(this DataGridView gv) 
    { 
     gv.CurrentCellDirtyStateChanged += (sender, args) => 
     { 
      gv.CommitEdit(DataGridViewDataErrorContexts.Commit); 
      if (gv.CurrentCell == null) 
       return; 
      if (gv.CurrentCell.EditType != typeof(DataGridViewTextBoxEditingControl)) 
       return; 
      gv.BeginEdit(false); 
      var textBox = (TextBox)gv.EditingControl; 
      textBox.SelectionStart = textBox.Text.Length; 
     }; 
    } 
+1

Вы имеете дело с событиями (http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx) и лямбды (http://msdn.microsoft .com/en-us/library/bb397687.aspx) – juharr

ответ

0

Что вы видите, есть выражение Лямбда. Выражение Lambda - очень сжатый синтаксис для встроенного определения метода, так называемого анонимного делегата.

Вместо того, чтобы объявить ...

private void Cell_StateChanged(object sender, EventArgs args) 
{ 
    some code; 
} 

... и объявление события ...

gv.CurrentCellDirtyStateChanged += Cell_StateChanged; 

... Вы пишете

gv.CurrentCellDirtyStateChanged += (sender, args) => { some code; }; 

часть перед => (произносится как «идет к») является списком аргументов. Типы не должны быть объявлены, поскольку они выводятся из объявления события CurrentCellDirtyStateChanged.

Часть справа => - способ корпус.

Точка с запятой в конце - это точно такая же точка с запятой, как в gv.CurrentCellDirtyStateChanged += Cell_StateChanged;.

Вы можете даже опустить фигурные скобки, если имеется только одно заявление:

gv.CurrentCellDirtyStateChanged += (sender, args) => Print(args); 

лямбда-выражения могут быть также использованы для методов функции:

Func<double, double> f = x => x * x; // You can drop the() if there is only 1 argument 

Здесь x => x * x выполняет то же самое расчет как

private double Square(double x) 
{ 
    return x * x; 
} 

Задачи Func<double, double> f = x => x * x; и Func<double, double> f = Square; эквивалентны. Так

double y = f(3); 
// y = 9 

Я не объяснил += еще. Этот оператор используется для присоединения обработчика события к событию. В VB можно было бы написать более явно

AddHandler gv.CurrentCellDirtyStateChanged, AddressOf Cell_StateChanged 
+0

Благодарим вас и благодарим за примеры. –

0

Для общего объяснения, все, что делает метод назначить событие на DataGridView для анонимной функции (лямбда-выражения).

Теперь синтаксис:

  • += добавляет операнд справа на событие слева. События - это многоадресные делегаты, поэтому один вызов события может запускать несколько функций (отсюда «+ =» вместо «=», вы добавляете в список).

  • => является частью синтаксиса лямбда. Как правило, лямбда выглядит как (<args>) => { expressions }. Имеются сокращенные версии, но ваш пример следует за этим синтаксисом. На английском языке мы говорим «такое, что», когда этот символ встречается.

  • После закрытия есть ; для выражения лямбда, потому что вы завершаете утверждение, а именно назначение задания.

+0

Спасибо. Хотел бы я отметить как ответ, потому что ваши объяснения ясны и кратки и понятнее, чем принятый ответ. –

+0

@ThomAsh Другой ответ был, конечно, более полным :) Не беспокойтесь, рад, что я мог бы помочь. – BradleyDotNET

Смежные вопросы