Утилизация объекта более чем одна ошибка времени. CA2202. Есть ли способ лучше? - PullRequest
4 голосов
/ 10 мая 2010

Как я могу убедиться, что следующий код удаляет все объекты лучше? В настоящее время анализ кода говорит мне

Ошибка 45 CA2202: Microsoft.Usage: объект 'ns' может быть размещен более одного раза в методе 'CPCommunicator.GetResults (string)'. Во избежание генерации исключения System.ObjectDisposedException не следует вызывать метод Dispose для объекта более одного раза .: строки: 64, 65

NetworkStream ns = null;
StreamWriter requestStream = null;
TextReader responseStream = null;

var results = new StringBuilder();

try
{
    ns = new NetworkStream(CreateConnection(), true);
    requestStream = new StreamWriter(ns);
    requestStream.Flush();
    responseStream = new StreamReader(ns);

    requestStream.Write(reportData);
    requestStream.Flush();
    while (responseStream.Peek() != -1)
    {
        var currentLine = responseStream.ReadLine();
        results.Append(currentLine);
        results.Append("\n");
    }
}
finally
{
    if (requestStream != null) requestStream.Close();
    if (responseStream != null) responseStream.Close();
    if (cpNetworkStream != null) cpNetworkStream.Close();
}

Поскольку и requestStream, и responseStream используют ns, они оба располагают ns, поэтому, чтобы удовлетворить предупреждение анализа кода, я должен закомментировать последние два метода close в блоке finally. Но действительно ли я хочу сделать это ?????

Ответы [ 2 ]

4 голосов
/ 10 мая 2010

Да, imho, вам действительно стоит позвонить только один раз.

В качестве альтернативы вы можете использовать синтаксис using для ns, что делает всю ситуацию еще яснее.

using (ns = new NetworkStream(CreateConnection(), true)) {
   ...
}
2 голосов
/ 10 мая 2010

Я бы реорганизовал ваш код так:

using (NetworkStream ns = new NetworkStream(CreateConnection(), true))
using (StreamWriter requestStream = new StreamWriter(ns))
using (TextReader responseStream = new StreamReader(ns))
{

    var results = new StringBuilder();

    requestStream.Flush();

    requestStream.Write(reportData);
    requestStream.Flush();
    while (responseStream.Peek() != -1)
    {
        var currentLine = responseStream.ReadLine();
        results.Append(currentLine);
        results.Append("\n");
    }
}
...