Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9525

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

$
0
0

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

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

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

HttpResponseMessagehttpResponse=awaitthis.httpClient.SendAsync(httpRequest);// null かもしれない参照型の非同期メソッドを呼び出すstringcontent=awaithttpResponse.Content?.ReadAsStringAsync();

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

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

何が起こったか

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

awaithttpResponse.Content?.ReadAsStringAsync();

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

どう解決したか

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

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

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

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

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


Viewing all articles
Browse latest Browse all 9525

Trending Articles