CA2000 - ошибки внешкольных юниоров-программистов или ложный положительный результат?
В настоящее время я разрабатываю некоторые настольные приложения с использованием веб-сокетов (точнее: я работаю с Alchemy WebSockets). К настоящему времени мой код работает нормально, но Visual Studio 2010 говорит мне
Warning 2 CA2000 : Microsoft.Reliability : In method 'ServerController.SetupServer(int)', call System.IDisposable.Dispose on object '<>g__initLocal0' before all references to it are out of scope. C:\Users\MaRiedl\documents\visual studio 2010\Projects\Alchemy-WebSockets\AWS-Server\ServerController.cs 38 AWS-Server
Я уже пытался решить эту проблему с помощью справки MSDN ( http://msdn.microsoft.com/en-us/library/ms182289.aspx) и (конечно), выполняя поиск в stackru.com днем и ночью ( использует "использование") в C#) - но, к сожалению, лучше не станет.
Итак, вот мой вопрос: далеко ли я до "младшего", чтобы увидеть проблему, которую не могу найти, или это просто ложный позитив от Visual Studio 2010?
Вот фрагмент кода, с которым я борюсь:
private WebSocketServer _webSocketServer;
private void SetupServer(int port)
{
// set port and configure authorized ip addresses to connect to the server
_webSocketServer = new WebSocketServer(port, IPAddress.Any)
{
OnReceive = OnReceive,
OnSend = OnSend,
OnConnect = OnConnect,
OnConnected = OnConnected,
OnDisconnect = OnDisconnect,
TimeOut = new TimeSpan(0, TimeoutInMinutes, 0)
};
_webSocketServer.Start();
}
1 ответ
Предупреждение анализа кода вызвано тем, что вы используете инициализатор объекта для одноразового объекта.
Всякий раз, когда вы используете инициализатор объекта, создается временный невидимый локальный объект (см. Этот вопрос для получения более подробной информации). Именно этот объект (<>g__initLocal0
) на которое ссылается сообщение, поскольку вы не можете его удалить, если во время его создания выдается исключение.
Если вы установите свойства отдельно
_webSocketServer = new WebSocketServer(port, IPAddress.Any);
_webSocketServer.OnReceive = OnReceive;
тогда сообщение исчезнет, так как временный объект не создается.