我怎样才能安全地在一行中取消订阅一个动作?

How can I safely unsubscribe from an Action in one line?

我想知道是否可以仅用一行代码以安全的方式取消订阅 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 开始,您必须能够在空委托上使用 += 进行订阅。取消订阅也是如此。

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

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


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

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

这将 允许 +=-= ,并防止被 RaiseCustomEvent = MySingleMethod

覆盖