По умолчанию (CancellationToken) эквивалентно CancellationToken.None?

19

Рассматривая реализацию CancellationToken.None , он просто возвращает default(CancellationToken) . Тем не менее, я не вижу ссылки в документации CancellationToken , что они эквивалентны.

Я хотел бы предложить API, как это, но только до тех пор, пока я не уверен, что он всегда будет работать:

Task DoSomething(CancellationToken token = default(CancellationToken))

Определено ли поведение, что default(CancellationToken) совпадает с CancellationToken.None или это просто деталь реализации?

    
задан Cory Nelson 23.10.2013 в 15:52
источник
  • Это структура. Таким образом, вы просто получаете значение структуры со всеми членами, установленными по умолчанию. Точно так же, как новый CancellationToken. Также причина, по которой декомпилятор lazy не может правильно восстановить исходный код. –  Hans Passant 23.10.2013 в 16:53
  • Так нормально это делать? –  tofutim 12.03.2014 в 18:47
  • @tofutim Нет, поскольку реализация CancellationToken.None не задокументирована как возвращающая значение по умолчанию (CancellationToken), и поэтому она может быть изменена. –  Cory Nelson 12.03.2014 в 19:09

4 ответа

18

После подачи проблемы с помощью corefx, документация были обновлены, чтобы сделать это гарантированной функцией:

  

Вы также можете использовать оператор C # default(CancellationToken) для создания пустого маркера отмены.

    
ответ дан Cory Nelson 17.09.2015 в 17:24
источник
9

Они одинаковы. Проверить исходный код

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

От Ссылка

    
ответ дан qxg 11.04.2014 в 13:20
источник
6

CancellationToken.None просто возвращает новое CancellationToken:

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

Таким образом, CancellationToken является структурой, то default(CancellationToken) вернет такое же значение. C # Spec 5.2:

  

Для переменной типа значения значение по умолчанию такое же, как и значение   значение, вычисленное конструктором default-type по умолчанию

UPDATE: это поведение не определено в MSDN, поэтому вы можете полагаться только на текущую реализацию.

    
ответ дан Sergey Berezovskiy 23.10.2013 в 15:57
источник
  • Мой вопрос в том, является ли это определяемым поведением, на чем я могу положиться, или просто с детальностью реализации. –  Cory Nelson 23.10.2013 в 16:10
  • @CoryNelson вы можете полагаться только на документацию MSDN, которая определяет только то, что токен будет не отменен. В нем также говорится, что токен будет «пустым», но он не объясняет, что означает «пустой». Детали реализации могут измениться. Но документированное поведение также может измениться. Можете ли вы на это положиться? Если вы не измените версию .Net framework, которую используете, то ни реализация, ни поведение не изменятся. –  Sergey Berezovskiy 23.10.2013 в 16:20
  • Документальное поведение обычно не изменяется в соответствии с политикой Microsoft по поддержке и обратной совместимости. –  usr 23.10.2013 в 16:22
  • @usr foreach например? –  Sergey Berezovskiy 23.10.2013 в 16:22
  • Избегайте использования декомпилятора, это не то, на что похоже реальный исходный код. Вместо этого используйте ссылочный источник. –  Hans Passant 23.10.2013 в 16:56
Показать остальные комментарии
0

default определяется для каждого типа. Это null для ссылочных типов. Это «пустой» экземпляр для структур, т. Е. Один со всеми свойствами, инициализированными соответствующими значениями по умолчанию.

    
ответ дан Daniel Hilgarth 23.10.2013 в 16:00
источник
  • Но определено ли это эквивалентом CancellationToken.None? –  usr 23.10.2013 в 16:17
  • @usr: Такое определение не существует, потому что CancellationToken.None является простым свойством. И в документации указано только, что она возвращает пустое значение CancellationToken. Но поскольку CancellationToken является структурой, мы можем предположить, что она эквивалентна умолчанию (CancellationToken). –  Daniel Hilgarth 23.10.2013 в 17:09
  • Токен, возвращенный CancellationToken.None может отличаться от умолчания (CancellationToken), и я не вижу причин, почему этого не может быть. Я согласен, что это не так, и я полагаюсь на это на практике. Но этот вопрос касается гарантий, предоставленных или не предоставленных Microsoft. –  usr 23.10.2013 в 17:23
  • @usr: Я согласен с вами. Какой у вас вопрос / вопрос? –  Daniel Hilgarth 23.10.2013 в 17:28