que - lista de objetos c#
Los inicializadores de objetos en using-block generan una advertencia de análisis de código CA2000 (1)
No, hay una diferencia.
Un inicializador de objeto solo se asigna a la variable después de que se hayan establecido todas las propiedades. En otras palabras, esto:
Foo x = new Foo { Bar = "Baz" };
es equivalente a:
Foo tmp = new Foo();
tmp.Bar = "Baz";
Foo x = tmp;
Eso significa que si uno de los establecedores de propiedades lanzó una excepción en su caso, el objeto no se eliminaría.
EDIT: como pensé ... intente esto:
using System;
public class ThrowingDisposable : IDisposable
{
public string Name { get; set; }
public string Bang { set { throw new Exception(); } }
public ThrowingDisposable()
{
Console.WriteLine("Creating");
}
public void Dispose()
{
Console.WriteLine("Disposing {0}", Name);
}
}
class Test
{
static void Main()
{
PropertiesInUsingBlock();
WithObjectInitializer();
}
static void PropertiesInUsingBlock()
{
try
{
using (var x = new ThrowingDisposable())
{
x.Name = "In using block";
x.Bang = "Ouch";
}
}
catch (Exception)
{
Console.WriteLine("Caught exception");
}
}
static void WithObjectInitializer()
{
try
{
using (var x = new ThrowingDisposable
{
Name = "Object initializer",
Bang = "Ouch"
})
{
// Nothing
}
}
catch (Exception)
{
Console.WriteLine("Caught exception");
}
}
}
Salida:
Creating
Disposing In using block
Caught exception
Creating
Caught exception
Observe que no hay una línea de "Inicializar objeto de disposición".
Si utilizo los inicializadores de objetos en using-block, recibo una advertencia de Análisis de Código acerca de no desechar el objeto correctamente:
CA2000: Microsoft.Reliability: En el método ''ReCaptcha.CreateReCaptcha (este HtmlHelper, string, string)'', el objeto ''<> g__initLocal0'' no está dispuesto en todas las rutas de excepción. Llame a System.IDisposable.Dispose en el objeto ''<> g__initLocal0'' antes de que todas las referencias al mismo estén fuera de alcance.
Aquí está el código:
using (var control = new ReCaptchaControl()
{
ID = id,
Theme = theme,
SkipRecaptcha = false
})
{
// Do something here
}
Si no uso inicializadores de objetos, Code Analysis está contento:
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 darían lugar a la misma IL. ¿O es esto un error en el motor de análisis de código?