在 CancellationToken 的情况下,使用结构体而不是引用类型有意义吗?
我看到一种可能的缺点是,当我将它作为参数传递时,它将在整个方法链中被复制。
与此同时,由于它是结构体,它可能会更快地分配和释放。
如果我们想要使其不可变,则可以使用只读属性或私有设置器。
那么这背后的想法是什么?
在 CancellationToken 的情况下,使用结构体而不是引用类型有意义吗?
我看到一种可能的缺点是,当我将它作为参数传递时,它将在整个方法链中被复制。
与此同时,由于它是结构体,它可能会更快地分配和释放。
如果我们想要使其不可变,则可以使用只读属性或私有设置器。
那么这背后的想法是什么?
提问者还提出了另一种使用单个共享实例作为引用类型的备选实现。只是出于兴趣,为什么CancellationToken是值类型?
我要注意的是,当前的值类型实现与引用类型完全相同大小,因此没有任何额外的复制开销。它还可以防止在用户代码中进行某些额外的模板代码空检查,特别是将token作为可选参数时。这肯定可以工作,并且在很大程度上是等效的(我们在早期原型设计中就是这样实现的),但是我们出于两个特定原因选择了当前设计:
- 每个CTS / Token只有一个类实例,因此减少GC压力。
- 我们将所有状态和大部分逻辑合并到CTS中。 分离的安排有点复杂。