附加的扩展方法的语法
本文关键字:语法 方法 扩展 | 更新日期: 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表达式的结束
}
之后有一个;
,因为您正在完成一个语句,即事件赋值的语句。