【问题标题】:Syntax of the attached extension method附加扩展方法的语法
【发布时间】:2014-12-02 02:19:46
【问题描述】:

我是C#初学者,在How do I make a DataGridView immediately commit edits?下载了扩展方法,方法很好用,但是语法看不懂。

我的问题是用两行来解释语法。
第一行: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;
        };
    }

【问题讨论】:

标签: c# winforms datagridview


【解决方案1】:

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

而不是声明...

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

...和事件声明...

gv.CurrentCellDirtyStateChanged += Cell_StateChanged;

...你写

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

=>(读作“goes to”)之前的部分是参数列表。这些类型不需要声明,因为它们是从事件 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 =&gt; x * x执行与

相同的计算
private double Square(double x)
{
    return x * x;
}

Func&lt;double, double&gt; f = x =&gt; x * x;Func&lt;double, double&gt; f = Square; 的赋值是等价的。所以

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

我还没有解释+=。此运算符用于将事件处理程序附加到事件。在 VB 中你会写得更明确

AddHandler gv.CurrentCellDirtyStateChanged, AddressOf Cell_StateChanged

【讨论】:

    【解决方案2】:

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

    现在是语法:

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

    • =&gt; 是 lambda 语法的一部分。通常,lambda 看起来像 (&lt;args&gt;) =&gt; { expressions }。有速记版本,但您的示例遵循此语法。在英语中,遇到这个符号时我们会说“这样”。

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

    【讨论】:

    • 谢谢。希望我可以将两者都标记为答案,因为您的解释清晰简洁,并且比接受的答案更容易理解。
    • @ThomAsh 另一个答案肯定更完整:) 不过不用担心,很高兴我能提供帮助。
    猜你喜欢
    • 2021-10-09
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多