7

为什么以下甚至是合法的?

CancellationToken.None.Register(delegate { });

例如,为什么Register不在这里抛出异常?是因为以上内容相当于NOP吗?

背景:问这个问题的原因是要了解在涉及注册时是否需要对接受 a 的方法CancellationToken进行防御性编码CancellationToken.None

4

1 回答 1

14

CancellationToken.None不是空引用,而是一个空的取消标记。因此,它确实有一个实例。注册永远不会触发,因为源永远不会注册为被取消,但它会“正确地”通过。

但是,除非您小心处理正确返回的CancellationTokenRegistration,否则我仍然会对此进行检查和编码。


编辑:

CancellationToken.None经进一步调查,如果您对CancellationTokenRegistration. 这不会保留对您的对象或委托的引用,也不会形成泄漏,因此出于实际目的,它是无操作的。这应该是安全的,并且不应该要求您最终避免采取防御措施。

于 2011-03-30T17:05:54.243 回答