Pourquoi CancellationToken est séparé de CancellationTokenSource?

Je suis à la recherche d'une justification de la raison .NET CancellationToken struct a été introduit en plus de la CancellationTokenSource classe. Je comprends comment l'API est utilisée, mais qui veulent aussi comprendre pourquoi il est conçu de cette façon.

I. e., pourquoi devons-nous:

var cts = new CancellationTokenSource();
SomeCancellableOperation(cts.Token);

...
public void SomeCancellableOperation(CancellationToken token) {
    ...
    token.ThrowIfCancellationRequested();
    ...
}

au lieu de directement passer CancellationTokenSource autour comme:

var cts = new CancellationTokenSource();
SomeCancellableOperation(cts);

...
public void SomeCancellableOperation(CancellationTokenSource cts) {
    ...
    cts.ThrowIfCancellationRequested();
    ...
}

Est-ce une optimisation de la performance basée sur le fait que l'annulation de contrôles d'état de se produire plus souvent que de passer le jeton autour?

De sorte que CancellationTokenSource pouvez garder une trace de et mise à jour CancellationTokens, et pour chaque jeton de l'annulation de la case est un champ local d'accès?

Étant donné qu'un volatile bool avec aucun verrouillage n'est suffisante dans les deux cas, je ne vois toujours pas pourquoi ce serait plus rapide.

Merci!