我怎样才能安全地在一行中取消订阅一个动作?
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
覆盖
我想知道是否可以仅用一行代码以安全的方式取消订阅 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