附加的扩展方法的语法

本文关键字:语法 方法 扩展 | 更新日期: 2023-09-27 18:25:53

我是C#初学者,在"如何使DataGridView立即提交编辑"中下载了扩展方法?该方法效果很好,但不理解语法。

我的问题是要求对两行的语法进行解释
第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;
        };
    }

附加的扩展方法的语法

您看到的是一个Lambda表达式。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);

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

分配CCD_ 10和CCD_。所以

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

我还没有解释+=。此运算符用于将事件处理程序附加到事件。在VB中,您可以更明确地编写

AddHandler gv.CurrentCellDirtyStateChanged, AddressOf Cell_StateChanged

为了得到全面的解释,该方法所做的只是将DataGridView上的一个事件分配给一个匿名函数(lambda表达式)。

现在是语法:

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

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

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