Is default(CancellationToken) equivalent to CancellationToken.None?

孤街醉人 提交于 2019-12-06 16:38:24

问题


Looking at the implementation of CancellationToken.None, it is simply returning default(CancellationToken). However, I see no reference in CancellationToken's documentation that the two are equivalent.

I'd like to offer an API like this but not until I'm sure it'll always work:

Task DoSomething(CancellationToken token = default(CancellationToken))

Is it defined behavior that default(CancellationToken) is the same as CancellationToken.None, or is this just an implementation detail?


回答1:


After filing an issue with corefx, the documentation remarks have been updated to make this a guaranteed feature:

You can also use the C# default(CancellationToken) statement to create an empty cancellation token.




回答2:


They are the same. Check source code

public static CancellationToken None
{
    get { return default(CancellationToken); }
}

From https://referencesource.microsoft.com/#mscorlib/system/threading/CancellationToken.cs,36b17ded8b1a228c




回答3:


CancellationToken.None simply returns new CancellationToken:

public static CancellationToken None
{    
    get
    {
        return new CancellationToken();
    }
}

Thus CancellationToken is a struct, then default(CancellationToken) will return same value. C# Spec 5.2:

For a variable of a value-type, the default value is the same as the value computed by the value-type’s default constructor

UPDATE: This behavior is not defined on MSDN, so you can rely only on current implementation.




回答4:


default is defined for every type. It is null for reference types. It is an "empty" instance for structs, i.e. one with all properties initialized to their respective default values.



来源:https://stackoverflow.com/questions/19543623/is-defaultcancellationtoken-equivalent-to-cancellationtoken-none

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!