0

次のようなコードで、R# から「「NotNull」属性でマークされたエンティティへの「可能性のある「null」割り当て」というフィンガーワグがいくつか得られます。

if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
    var reader = new StreamReader(webResponse.GetResponseStream()); // <-- R# hates this line of code

この場合、どのように StreamReader を null にできますか? 可能であれば、その可能性を防御的にプログラムするにはどうすればよいですか?

アップデート

さて、このコードを変更すると:

String strResult;
WebRequest objRequest = WebRequest.Create(strURL);
WebResponse objResponse = objRequest.GetResponse();
using (var sr = new StreamReader(objResponse.GetResponseStream()))
{
    strResult = sr.ReadToEnd();
    sr.Close();
}
return strResult;

...これに:

String strResult = string.Empty;
WebRequest objRequest = WebRequest.Create(strURL);
WebResponse objResponse = objRequest.GetResponse();
using (var sr = new StreamReader(objResponse.GetResponseStream()))
{
    if (sr != null)
    {
        strResult = sr.ReadToEnd();
        sr.Close();
    }
}
return strResult;

...同じ (「使用中」の) 回線で同じフィンガーワグを取得します。

そして、これを次のように変更すると:

String strResult = string.Empty;
WebRequest objRequest = WebRequest.Create(strURL);
WebResponse objResponse = objRequest.GetResponse();
if (objResponse != null)
{
    using (var sr = new StreamReader(objResponse.GetResponseStream()))
    {
        strResult = sr.ReadToEnd();
        sr.Close();
    }
}
return strResult;

...「「NotNull」属性でマークされたエンティティへの可能な「null」割り当て」は、依然として同じ行を参照しています。では、どうすれば R# のフィンガーワグを無効にできますか? 「使用」がnullの必要なチェックをラップするというISTM ...

更新 2

Resharper は次の行に文句を言います。

var reader = new StreamReader(webResponse.GetResponseStream());

..." 「NotNull」属性でマークされたエンティティへの「null」割り当ての可能性"

そこで、webResponse とリーダーの両方をチェックするように変更しました。

var webResponse = (HttpWebResponse)webRequest.GetResponse();
if ((webResponse != null) && (webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
    var reader = new StreamReader(webResponse.GetResponseStream());
    if (reader != null)
    {

...しかし、その後、「!=」テストの両方で「 Expression is always true 」と表示されます。「気をつけて! webResponse が null になる可能性があります!」と言っているようです。および/または、「注意してください!リーダーが null になる可能性があります!」しかし、「それは無駄なコードです。null になることはありません。」

4

2 に答える 2

4

null の可能性があるのは streamreader ではなく、webResponse.GetResponseStream() の結果です。

于 2013-11-23T00:46:05.503 に答える
2
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
    var responsestream = webResponse.GetResponseStream();
    if(responsestream != null) {
        var reader = new StreamReader(responsestream );
    }
}

StreamReadernull は ではなく、ですReponseStreamResponseStream警告を消したい場合は、返されたが null でないことを確認するチェックを追加するだけです。

于 2013-11-23T00:47:23.733 に答える