다음은 일반적인 장점의 내림차순으로 몇 가지 솔루션입니다.
1. default(CancellationToken)
기본값으로 사용 :
Task DoAsync(CancellationToken ct = default(CancellationToken)) { … }
의미 론적으로 CancellationToken.None
는 기본값에 대한 이상적인 후보이지만 컴파일 시간 상수가 아니기 때문에 사용할 수 없습니다. default(CancellationToken)
컴파일 시간 상수이고 공식적으로CancellationToken.None
.
2. CancellationToken
매개 변수 없이 메소드 오버로드 제공 :
당신이 선택적 매개 변수를 통해 메서드 오버로드를 선호하는 경우 또는 (볼 이 와 이 그 주제에 대한 질문에) :
Task DoAsync(CancellationToken ct) { … } // actual method always requires a token
Task DoAsync() => DoAsync(CancellationToken.None); // overload producing a default token
인터페이스 메서드의 경우 확장 메서드를 사용하여 동일한 결과를 얻을 수 있습니다.
interface IFoo
{
Task DoAsync(CancellationToken ct);
}
static class Foo
{
public static Task DoAsync(this IFoo foo) => foo.DoAsync(CancellationToken.None);
}
이로 인해 인터페이스가 더 얇아지고 구현자가 전달 메서드 오버로드를 명시 적으로 작성하지 않아도됩니다.
3. 매개 변수를 nullable로 만들고 null
기본값으로 사용 :
Task DoAsync(…, CancellationToken? ct = null)
{
… ct ?? CancellationToken.None …
}
nullable 형식에는 런타임 오버 헤드가 적고 null 병합 연산자 때문에 취소 토큰에 대한 참조가 더 장황 해지기 때문에이 솔루션이 가장 마음에 듭니다 ??
.
CancellationToken.None
뭔가 이상이된다default(CancellationToken)
.