web-dev-qa-db-ja.com

Resharper:notnull属性でマークされたエンティティへのnull割り当ての可能性

response.GetResponseStream()でこの警告が表示されます。これをどのように処理すればよいですか?

// Get response  
using (var response = request.GetResponse() as HttpWebResponse)
{
    // Get the response stream  
    if (response != null)
    {
        var reader = new StreamReader(response.GetResponseStream());
        var responseString = reader.ReadToEnd();
        return responseString;
    }
}

いくつかの回答の誤解に基づく明確化のため

この行はnotであり、警告が発生しています。

using (var response = request.GetResponse() as HttpWebResponse)

この行is警告が発生している場所:

var reader = new StreamReader(response.GetResponseStream());
32
katit
var reader = new StreamReader(response.GetResponseStream());

StreamReaderコンストラクターのパラメーターにnotnull属性があると思います。以下を試してください:

var stream = response.GetResponseStream();
if (stream == null)
  // throw an exception
var reader = new StreamReader(stream);
32

コードを短くして、使い捨てリソースをusingステートメントでラップしてみてください。

using (var response = request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
    return reader.ReadToEnd();
}

またはさらに:

using (var client = new WebClient())
{
    return client.DownloadString("http://foo.bar.com/")
}
6
Darin Dimitrov

responseオブジェクトのタイプがHttpWebRequestの場合、応答は常にタイプHttpWebResponseになります。そうでない場合、それは決してありません。

これを間違った場所でテストしている(結果を破棄するためにWebRequestによって派生した別のクラスを渡すことができるのに、なぜ.GetResponse()を呼び出すのか)か、効果なしで不要なテストを行っています。

その下のnullのテストにもかかわらず、リシャーパーがそれを心配していると思います。私は直接キャストに行くでしょう:

using (var response = (HttpWebResponse)request.GetResponse())
using(var reader = new StreamReader(response.GetResponseStream()))
  return reader.ReadToEnd();

または、HttpWebResponseから派生していないWebResponseのメンバーを使用していないことを考えると、キャストはまったく行われません。

using (var response = (HttpWebResponse)request.GetResponse())
using(var reader = new StreamReader(response.GetResponseStream()))
  return reader.ReadToEnd();
1
Jon Hanna