7

なぜ以下は合法なのですか?

CancellationToken.None.Register(delegate { });

たとえば、Registerここで例外をスローしないのはなぜですか? 上記がNOPになるからでしょうか?

背景:この質問をする理由は、 を受け入れるメソッドを、登録が関係する場合にCancellationToken防御的にコード化する必要があるかどうかを理解するためです。CancellationToken.None

4

1 に答える 1

14

CancellationToken.Noneはnull参照ではなく、空のキャンセルトークンです。そのため、インスタンスがあります。ソースがキャンセルされたものとして登録されることはないため、登録は実行されませんが、「適切に」実行されます。

ただし、 CancellationTokenRegistrationが適切に返されるように注意しない限り、これに対して防御的にチェックとコードを配置します。


編集:

さらに調査したところ、に登録するとCancellationToken.None、事実上何もしなくなり、CancellationTokenRegistration返却されたものは処分する必要がなくなります。これは、オブジェクトまたはデリゲートへの参照を保持せず、リークを形成しないため、実用的な目的では何もしません。これは安全に行う必要があり、あなたの側で避けるために防御的な慣行を必要とすべきではありません。

于 2011-03-30T17:05:54.243 に答える