İşte azalan genel iyilik sırasına göre birkaç çözüm:
1. default(CancellationToken)
Varsayılan değer olarak kullanma :
Task DoAsync(CancellationToken ct = default(CancellationToken)) { … }
Anlamsal olarak, CancellationToken.None
varsayılan için ideal aday olacaktır, ancak bu şekilde kullanılamaz çünkü bir derleme zamanı sabiti değildir. default(CancellationToken)
bundan sonraki en iyi şey, çünkü bir derleme zamanı sabiti ve eşdeğer olduğu resmi olarak belgelenmişCancellationToken.None
.
2. CancellationToken
Parametre olmadan yöntem aşırı yüklemesi sağlamak :
Veya isteğe bağlı parametrelere göre yöntem aşırı yüklemelerini tercih ederseniz ( buna ve bu konudaki bu soruya bakın ):
Task DoAsync(CancellationToken ct) { … }
Task DoAsync() => DoAsync(CancellationToken.None);
Arayüz yöntemleri için, aynı şey, genişletme yöntemleri kullanılarak elde edilebilir:
interface IFoo
{
Task DoAsync(CancellationToken ct);
}
static class Foo
{
public static Task DoAsync(this IFoo foo) => foo.DoAsync(CancellationToken.None);
}
Bu, daha ince bir arayüzle sonuçlanır ve uygulayıcıları, yönlendirme yöntemi aşırı yüklemesini açıkça yazmaktan kurtarır.
3. Parametreyi null yapılabilir yapma ve null
varsayılan değer olarak kullanma :
Task DoAsync(…, CancellationToken? ct = null)
{
… ct ?? CancellationToken.None …
}
Bu çözümü en azından seviyorum çünkü null yapılabilir türler küçük bir çalışma zamanı ek yükü ile geliyor ve iptal belirtecine yapılan başvurular boş birleştirme operatörü nedeniyle daha ayrıntılı hale geliyor ??
.
CancellationToken.None
bundan fazlası haline gelirse kodunuza ne olacağını düşünündefault(CancellationToken)
.