Si uso inicializadores de objeto en el uso de bloques consigo el análisis de código de advertencia acerca de no disponer el objeto correctamente:inicializadores de objeto en el uso de bloques de análisis de código genera la advertencia CA2000
CA2000: Microsoft.Reliability: En el método 'ReCaptcha. CreateReCaptcha (este HtmlHelper, cadena, cadena) ', objeto' <> g__initLocal0 'no se elimina a lo largo de todas las rutas de excepción. Call System.IDisposable.Dispose en el objeto '<> g__initLocal0' antes de que todas las referencias a él estén fuera del alcance.
Aquí está el código:
using (var control = new ReCaptchaControl()
{
ID = id,
Theme = theme,
SkipRecaptcha = false
})
{
// Do something here
}
Si yo no uso inicializadores de objeto, el análisis de código es feliz:
using (var control = new ReCaptchaControl())
{
control.ID = id;
control.Theme = theme;
control.SkipRecaptcha = false;
// Do something here
}
¿Cuál es la diferencia entre esos dos bloques de código? Pensé que resultaría en la misma IL. ¿O es esto un error en el motor de análisis de código?
Eso tiene sentido ahora que lo escribes. OMI es una trampa que se pasa por alto fácilmente. Afortunadamente, Visual Studio es más sabio que yo. – Tero
@Jon - Entonces, es correcto concluir que 'No use la sintaxis del inicializador de objetos con un tipo que también implemente IDisposable'. (Dado que la expansión no está bajo nuestro control para corregir el problema señalado por el motor de CA). – Gishu
@Gishu: Si le preocupa en absoluto que los instaladores de propiedades arrojen excepciones, sí. –