c# - soporta - optimizacion de consultas sql
¿Algún problema con las declaraciones de "uso" de anidación en c#? (5)
Eso es un problema recurrente con el análisis de código y CA2000 y CA2202.
Tiene la posibilidad de corregir esas advertencias no using
, pero usando try/finally/dipose
. Eso no es recomendable porque produce un código horrible.
Tu código funcionará, simplemente suprime esas advertencias .
También vea https://stackoverflow.com/a/21849534/870604 para StreamReader/Writer
y la propiedad de la transmisión subyacente.
Recientemente descargué Visual Studio 2013 y ejecuté el análisis de código en un proyecto en el que estoy trabajando. Se ha presentado un par de problemas con los que estoy trabajando, pero uno en particular es sobre cómo estoy usando la declaración "utilizable" de IDisposable.
Aquí hay un ejemplo de mi código:
using (MemoryStream msDecrypt = new MemoryStream(encryptedText.ToBase64Byte()))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
}
Entiendo que la advertencia de Análisis está tratando de decirme que la eliminación de múltiples objetos de esta manera podría generar un problema de eliminación de objetos.
Estoy seguro de que disponer sobre un objeto no va a lanzar una excepción en el caso anterior. Entonces, ¿debo modificar mi código o mantenerlo como está?
La razón de MSDN
Las declaraciones de uso anidadas (Uso en Visual Basic) pueden causar violaciones de la advertencia CA2202. Si el recurso IDisponible de la instrucción de uso interno anidado contiene el recurso de la declaración de uso externa, el método Dispose del recurso anidado libera el recurso contenido. Cuando se produce esta situación, el método Dispose de la declaración externa de uso intenta disponer su recurso por segunda vez.
aunque en tu caso Está bien usarlo así. Entonces, deberías suprimir la advertencia.
O
simplemente puede utilizar la forma fea de suprimir la advertencia modificando su código implementando Probar / finalmente. Aunque, realmente deberías evitar eso.
No debería haber ningún problema con su código, por lo que puedo decir, siempre he usado declaraciones de uso anidadas en el pasado.
Al analizar otras preguntas , creo que el problema está en la herramienta de análisis de código y en las reglas de CA2000 y CA2202. Los falsos positivos a menudo ocurren cuando se usan varios tipos de secuencias y lectores con el uso de declaraciones.
Debe ignorar las advertencias y continuar, ya que los métodos alternativos (como probar / finalmente) producirán un código incorrecto y su código es válido.
No veo ningún problema sobre el using
declaraciones de using
múltiple para desechar los objetos. Es común tener anidados utilizando declaraciones y su código es válido.
Usando objetos de diferentes tipos, puede anidar usando la sintaxis de una línea si quiere ahorrar espacio y mejorar la legibilidad:
using (MemoryStream msDecrypt = new MemoryStream(encryptedText.ToBase64Byte()))
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
El problema que encontró es recurrente con el análisis de código (puede encontrar la causa de la advertencia MSDN ). Luego puede ignorar la advertencia sobre las declaraciones de uso múltiple, porque esto es un falso positivo y su código es correcto y válido.
También puede suprimir la advertencia de esta manera (gracias a @ Jordão), como se describe en esta buena respuesta :
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public void MyMethodWithUsings()
{
using (MemoryStream msDecrypt = new MemoryStream(encryptedText.ToBase64Byte()))
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
Si desea eliminar la advertencia, tendrá que volver a escribir su código utilizando el bloque try/finally
y llamar al método Dispose()
de sus objetos en el bloque finally
, pero esto producirá un código horrible y no fácil de leer, ya que Se puede ver en esta pregunta .
Para este tipo de advertencia, puede ignorar fácilmente la advertencia, ya que generalmente es un falso positivo. Consulte los siguientes enlaces para más información: