gpt4 book ai didi

c# - 我怎样才能安全地在一行中取消订阅一个 Action ?

转载 作者:行者123 更新时间:2023-11-30 15:51:31 25 4
gpt4 key购买 nike

我想知道是否可以仅用一行代码以安全的方式取消订阅 C# 操作,而不必编写以下代码:

if(publisher.RaiseCustomEvent != null)
{
publisher.RaiseCustomEvent -= HandleCustomEvent;
}

一个简单的例子:

public class Publisher
{
public Action RaiseCustomEvent;

public MyClass() { }
}

public class Subscriber
{
Publisher _publisher;
public Subscriber()
{
_publisher = new Publisher();
_publisher.RaiseCustomEvent += HandleCustomEvent;
}

// ...

public void Dispose()
{
// DO this safely in one line
if(_publisher.RaiseCustomEvent != null)
{
_publisher.RaiseCustomEvent -= HandleCustomEvent;
}
}
}

最佳答案

if I can unsubscribe from a C# Action in a safe way in just one line of code

是的,您甚至不需要空值检查:

//if(publisher.RaiseCustomEvent != null)
{
publisher.RaiseCustomEvent -= HandleCustomEvent;
}

然后你当然可以清理它。
这是空安全的,可能不是线程安全的。

由于事件以 null 开始,您必须能够在 null 委托(delegate)上使用 += 进行订阅。取消订阅也是如此。

我什至认为 RaiseCustomEvent 是 event 还是 Action 字段并不重要。但请清楚这一点。

当然,您必须确保以空安全的方式引发事件,无论是使用 if ( ... != null) 还是使用 ?.Invoke ()


现在您已经发布了代码,您的 RaiseCustomEvent 是一个公共(public)字段。这在封装方面有一些缺点。使用事件是常见的做法:

public class Publisher
{
//public Action RaiseCustomEvent;
public event Action RaiseCustomEvent;
}

这将允许+=-=,并防止被RaiseCustomEvent = MySingleMethod覆盖p>

关于c# - 我怎样才能安全地在一行中取消订阅一个 Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57266454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com