附加扩展方法的语法

时间:2014-10-07 15:28:38

标签: c# winforms datagridview

我是C#初学者并在How do I make a DataGridView immediately commit edits?下载了扩展方法。该方法效果很好,但不理解语法。

我的问题是要在两行上解释语法。
  第1行:gv.CurrentCellDirtyStateChanged += (sender, args) =>什么是+==>?   第二行:};为什么这里需要分号?

    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;
        };
    }

2 个答案:

答案 0 :(得分:0)

你看到的是一个Lambda表达式。 Lambda Expression是一种非常简洁的语法,用于方法的内联定义,即所谓的匿名委托。

而不是宣布......

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);

Lambda表达式也可用于函数方法:

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

答案 1 :(得分:0)

要获得整体解释,所有方法都会将DataGridView上的事件分配给匿名函数(lambda表达式)。

现在的语法:

  • +=正在向右边的事件添加操作数。事件是多播委托,因此一个事件调用可以触发多个函数(因此&#34; + =&#34;而不是&#34; =&#34;,您将添加到列表中)。

  • =>是lambda语法的一部分。通常,lambda看起来像(<args>) => { expressions }。有简写版​​本,但您的示例遵循此语法。在英语中,我们说&#34;这样&#34;遇到此符号时。

  • 在lambda表达式的结束;之后有一个},因为您正在完成一个语句,即对事件的赋值。