qué que programacion objetos objeto metodos lista inicializar inicializador declarar clases arreglos c# .net visual-studio-2010

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?