我有以下代码:
recognizer = new GestureRecognizer();
recognizer.Tapped += (args) =>
{
// Send an OnSelect message to the focused object and its ancestors.
if (FocusedObject != null)
{
FocusedObject.SendMessageUpwards("OnSelect",
SendMessageOptions.DontRequireReceiver);
}
};
我正在Unity的一个项目中工作,我对这个操作的语法没有经验:
recognizer.Tapped += (args) =>
{
// Send an OnSelect message to the focused object and its ancestors.
if (FocusedObject != null)
{
FocusedObject.SendMessageUpwards("OnSelect",
SendMessageOptions.DontRequireReceiver);
}
我理解Tapped
是点按的事件监听器。但是,我不明白以下事项:
1)为什么他们使用+=
运算符来添加lambda函数。你怎么能添加这样的lambda函数?我总是在原始类型上使用+=
。
2)“args”来自哪里?
3)该lambda函数何时运行?
答案 0 :(得分:4)
为什么他们使用+ =运算符来添加lambda函数?
这里的要点是不 lambda方法,而事件并注册委托给它。 +=
运算符overrloads订阅更多事件侦听器。 Tapped
属性是一个事件(请参阅下面的链接)。
来自+=
运营商的文档:
+ =运算符还用于指定将响应事件而调用的方法;这种方法称为事件处理程序。在此上下文中使用+ =运算符称为订阅事件。
“args”来自哪里?
当事件触发时,它会触发一个参数(在Tapped
定义的特定情况下。当它发生时,它将此参数传递给所有事件监听器。
该lambda函数何时运行?
每当触发事件并导致调用所有侦听器时。其中之一就是这种lambda方法。
我建议看看:How to: Subscribe to and Unsubscribe from Events 更多关于events
的更多信息另请查看MSDN上的Delegates and Events和+= operator with Events
答案 1 :(得分:0)
基本上,它是一个lambda事件监听器。而不是将其定义为如下函数:
function void myEvent(object o, EventArgs args){};
recognizer.Tapped += myEvent;
它在同一个地方定义和分配。
使用+ =的原因是因为您可以将多个事件处理程序分配给同一事件,如下所示:
function void myEvent(object o, EventArgs args){};
function void yourEvent(object o, EventArgs args){};
recognizer.Tapped += myEvent;
recognizer.Tapped += yourEvent;
如果你想删除指定的事件,你可以使用 - =像这样:
recognizer.Tapped -= myEvent;
args是所有事件所需的事件处理程序定义的一部分