为什么是awaiters(GetAwaiter - 使一个类awaitable)结构,而不是类。是否危害到使用类?
Why are the awaiters (GetAwaiter - to make a class awaitable) structs and not classes. Does it harm to use a class?
public struct ConfiguredTaskAwaiter : ICriticalNotifyCompletion:
http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs#b8626cdb2f1cbe65
public struct YieldAwaiter : ICriticalNotifyCompletion:
http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/YieldAwaitable.cs#1e1219f924e9e3b7
public struct TaskAwaiter<TResult> : ICriticalNotifyCompletion
http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs#2c48fb3bdfc69022
推荐答案
背后做的原因 awaitables
A结构是为了避免不必要的堆分配,并尽量减少内存占用时,编译器创建的状态机在幕后。
The reason behind making awaitables
a struct is to avoid unnecessary heap allocations and minimize the memory footprint when the compiler creates the state machine behind the scenes.
这是一个实现细节。对于awaitable是类型这是没有必要结构
,而不是类
。为了加强这一说法,尝试编译Roslyn的异步方法在调试
模式下,你会看到状态机变成一个类,其中,作为编纂发布
将导致结构
。更多关于在Why是异步状态机类(而不是结构)的罗斯林?
This is an implementation detail. It is not necessary for an awaitable to be of type struct
and not a class
. To strengthen this statement, try compiling an async method in Roslyn in Debug
mode, and you'll see the state-machine turn into a class, where-as compiling in Release
will result in a struct
. More on that in Why are async state machines classes (and not structs) in Roslyn?
相关推荐
最新文章