17

現在

HttpWebRequestcalledの単純なヘルパー メソッドを実装しましたGetResponse(url)。現在、結果を読んだ後にWebResponseandを手動で閉じています。StreamReader次に、次のように結果を返します。

// construct the request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";

// get the result
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string result = reader.ReadToEnd();

// clean up and return the result
reader.Close();
response.Close();
return result;

提案された

ステートメントを閉じるのではなく、ステートメント内に return を含めることは安全ですか。これはesusingと同じ効果がありますか?.Close()

// construct the request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";

// get the result
using (WebResponse response = request.GetResponse())
{
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        return reader.ReadToEnd();
    }
}
4

3 に答える 3

25

これは安全であるだけでなく、例外がスローされた場合でもオブジェクトを破棄するという点で、オリジナルよりも安全です。ステートメントは/ステートメントusingと同等です。tryfinally

一般に、Close()またはDispose()を明示的に記述するときはいつでも、using代わりにステートメントを使用できるかどうかを検討してください。

(ちなみに、Web 応答からのエンコーディングを使用していないことに注意してください。常に UTF-8 を想定しています。WebClient代わりに使用すると、オプションである場合、これをより簡単にすることができます。)

于 2012-10-12T14:18:05.443 に答える
1
using (StreamReader reader = new StreamReader())
{
    // code
}

と同じです

StreamReader reader;
try
{
    reader = new StreamReader();
    // code
}
finally
{
    if (reader != null)
    {
        reader.Dispose();
    }
}

したがって、コードとほぼ同じですが、try/finallyブロックがあるため安全です。

于 2012-10-12T14:20:35.683 に答える
1

これを行うことをお勧めします:

    string ret = string.Empty;
    using (WebResponse response = request.GetResponse())
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            ret = reader.ReadToEnd();
        }
    }
    return ret;

「using」を使用しても安全です。WebResponse と StreamReader は破棄されますが、リターンが実行されることは保証されません。

于 2012-10-12T14:26:34.497 に答える