LoginSignup
13
5

More than 3 years have passed since last update.

【C#】非同期メソッドの呼び出しでNULL条件演算子 ?. を使ってもNULL参照例外を起こす

Last updated at Posted at 2020-07-20

null条件演算子?.で安全に参照型にアクセスできるはず...

?.を使うとnullかもしれない参照型に安全にアクセスすることができます。
?.はアクセスの前に、左辺がnullかどうかテストしnullでない場合、アクセスが行われます。

下記コードならhttpResponse.Contentnullでもnull参照例外をスローしないと考えました。

HttpResponseMessage httpResponse = await this.httpClient.SendAsync(httpRequest);
// null かもしれない参照型の非同期メソッドを呼び出す
string content = await httpResponse.Content?.ReadAsStringAsync();

しかし、 Contentnullの場合、参照例外がスローされました。

System.NullReferenceException: Object reference not set to an instance of an object.

何が起こったか

?.演算子は?.の左辺がnullの場合、nullが返します。

await httpResponse.Content?.ReadAsStringAsync();

Contentnullの時、nullawaitしてしまっています。

どう解決したか

??null合体演算子)を使い、?.nullを返した時にTaskを返すようにします。
今回はContentnullの時は空文字が欲しかったので以下のようにしました。

HttpResponseMessage httpResponse = await this.httpClient.SendAsync(httpRequest);
// ※実行順序を正しくするため`await`する内容を`()`で囲む必要があります。
string content = await (httpResponse.Content?.ReadAsStringAsync() ?? Task.FromResult(string.Enmpty));

戻り値がない場合は、Task.CompleteTaskを使い以下のようにします。

await (this.FooService?.BarAsync() ?? Task.CompleteTask);

これでnullかもしれない参照型の非同期メソッドを安全に呼び出すことができました。
結構見逃しやすい部分ですので注意したいと思います。

13
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
5