- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我熟悉 C# 中的事件和委托(delegate),并且我已经使用它们很长一段时间了
// Subscribing
SomeEvent += SomeMethod;
// Unsubscribing
SomeEvent -= SomeMethod;
但是,我看到了类似以下的内容
SomeEvent = SomeMethod
它与订阅事件有何不同。在上面的代码中
SomeMethod
在
SomeEvent
时被调用被提出,但它与订阅事件有什么不同,它在幕后做了什么?
SomeEvent = SomeMethod
称为单播委托(delegate)使用或单播使用。
public class Testing : MonoBehaviour
{
// UnityAction is a simple delegate
// public delegate void UnityAction();
private UnityAction OnTestAction;
private void Start()
{
OnTestAction = OnTestActionHandler;
}
private void OnTestActionHandler()
{
Debug.Log("On Test Action Handler");
}
// Update is basically infinite loop in unity
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
OnTestAction?.Invoke();
}
if (Input.GetKeyDown(KeyCode.A))
{
OnTestAction -= OnTestActionHandler;
}
}
}
在上面的代码中,我发现它与
Subscribing
相同。和
Unsubscribing
, 那么我们可以使用
+=
而不是
=
还是用
+=
不好当您只需将事件订阅到单个方法时?
最佳答案
请注意,只有 field-like events可以这样使用:
SomeEvent = SomeMethod;
SomeEvent += SomeMethod;
和
SomeEvent -= SomeMethod;
另一方面,可用于所有事件,它们调用
add
和
remove
SomeEvent
的访问者分别。
Within the program text of the class or struct that contains the declaration of an event, certain events can be used like fields. To be used in this way, an event [...] must not explicitly include event_accessor_declarations. Such an event can be used in any context that permits a field. The field contains a delegate which refers to the list of event handlers that have been added to the event. If no event handlers have been added, the field contains null.
add
和
remove
访问器。
SomeEvent = SomeMethod;
基本上将该字段设置为调用列表仅包含
SomeMethod
的委托(delegate)。 .这意味着列表中所有先前的处理程序都将被丢弃。如果您想知道如何将方法名称转换为委托(delegate),请参阅
method group conversions .
add
和
remove
类字段事件的访问器会自动生成:
When compiling a field-like event, the compiler automatically creates storage to hold the delegate, and creates accessors for the event that add or remove event handlers to the delegate field. The addition and removal operations are thread safe, and may (but are not required to) be done while holding the lock on the containing object for an instance event, or the type object for a static event.
private EventHandler m_SomeEvent;
private event EventHandler SomeEvent
{
[CompilerGenerated]
add
{
EventHandler eventHandler = this.SomeEvent;
while (true)
{
EventHandler eventHandler2 = eventHandler;
EventHandler value2 = (EventHandler)Delegate.Combine(eventHandler2, value);
eventHandler = Interlocked.CompareExchange(ref this.SomeEvent, value2, eventHandler2);
if ((object)eventHandler == eventHandler2)
{
break;
}
}
}
[CompilerGenerated]
remove
{
EventHandler eventHandler = this.SomeEvent;
while (true)
{
EventHandler eventHandler2 = eventHandler;
EventHandler value2 = (EventHandler)Delegate.Remove(eventHandler2, value);
eventHandler = Interlocked.CompareExchange(ref this.SomeEvent, value2, eventHandler2);
if ((object)eventHandler == eventHandler2)
{
break;
}
}
}
}
注意字段
m_SomeEvent
,以及对
Delegate.Remove
的调用和
Delegate.Combine
- 这些是将新处理程序添加到处理程序列表中的内容,并从处理程序列表中删除处理程序。
So can we use += instead of = or is it bad to use += when you only have to subscribe event to single method?
+=
还不错当您仅订阅一种方法时。事实上,我建议你使用
+=
.你现在可能会说“我只想订阅一个方法”,但你永远不知道什么时候会改变 :)
关于c# - C#中的 `event = method`是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67086586/
这段代码无法编译: for(vector::iterator it = shapes.end(); it >= shapes.begin(); --it){ *it.update(1,1);
我一直在研究 Common Lisp 对象协议(protocol) (CLOS),我遇到了一个疑问。 有人知道 CLOS 中的“标准方法组合”和“简单方法组合”是什么意思吗? 在“简单方法组合”中,“
在Rust上对值调用方法之间是否有任何区别,如下所示: struct A { e: u32 } impl A { fn show(&self) { println!("{}",
我在一些 StackOverflow 答案中看到了术语抽象方法、具体方法和默认方法的“不同”定义。 Java 语言规范给出的真正定义是什么?请在您的答案中包含相关的支持 JLS 引用资料。 最佳答案
如果method = "post",如何使rest[method]扩展为rest.post(uri, body).then(. .? function proxyUrl() { return
这个问题在这里已经有了答案: Method cannot be translated into a store expression (1 个回答) 关闭 9 年前。 我有一个问题。我在 Visua
它们各自的优缺点是什么? 接口(interface)方法 虚方法 抽象方法 什么时候应该选择什么?做出这一决定时应牢记哪些要点? 最佳答案 虚拟和抽象几乎是一样的。虚方法在基类中有一个可以选择被覆盖的
我在 Meteor.js 上的那段代码出错: 客户端 : Meteor.call("logUser", function(myvar){ console.log("le c
运行代码时出现以下错误 Line: 18 illegal start of expression Line: 18 ';' expected 这意味着第 18 行中有代码写得不正确(public bo
如果可能的话,如何从另一个方法的返回中调用一个方法? 例如…… class Example { public static void main(String[] args) {
当遍历指针的 vector (或其他容器)时,使用以下优势和/或优势之间是否有任何区别: for (it = v.begin(); it != v.end(); ++it) { (*it)->
在从带有参数的 void 方法打印值或将值返回给方法调用者并在方法调用者中打印它之间,哪个被认为是更好的做法(如果有的话)?比如第一个代码摘录是前者,第二个代码摘录是后者: public static
考虑这个例子https://codesandbox.io/s/1yvp4zz5x7?module=%2Fsrc%2FApp.vue Greet1 Greet2
晚上好, 我刚开始使用 Microsoft.Contracts(最新版本)并将其插入示例界面之上,现在它看起来像这样: namespace iRMA2.Core.Interfaces { us
我是 Laravel 4 的新手,并试图弄清楚为什么我收到一个错误,说 Method [show] 不存在。 我没有名为“show”的方法,只能想象这是一个内部的 Laravel 方法,但我不知道如何
有人可以向我解释一下当我们进行下一次返回时“或”(||) 是什么意思吗? 我的意思是这行: 返回封面(值,金额 - 值 [索引],索引 + 1)||覆盖(值、金额、索引 + 1); public st
这个问题已经有答案了: Why doesn't the post increment operator work on a method that returns an int? (11 个回答) 已
我很难理解 jQuery 的 $.method() 和 $(selector).method 之间的区别。 $.method() 实际适用于 DOM 中的哪些元素?如果有人能帮助解释这两种说法之间的区
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve t
////////////////////////////////////////////////////////////////////////////// // 3 construct
我是一名优秀的程序员,十分优秀!