2012-10-11 20 views
49

¿Hay algún beneficio al usar los inicializadores de objetos C#?¿Hay algún beneficio de usar un Inicializador de objetos?

En C++ no hay referencias y todo está encapsulado dentro de un objeto, por lo que tiene sentido usarlos en lugar de inicializar los miembros después de la creación del objeto.

¿Cuál es el caso de su uso en C#?

How to: Initialize Objects by Using an Object Initializer (C# Programming Guide)

+3

Es un azucar sintáctico para guardar algunas pulsaciones de teclas y obtener código en una sola instrucción ejecutable (para cosas como inline linq calls). El estilo también es prestado para la creación de tipo anónimo: 'new {FirstName =" Adam ", Age = 27};' –

+0

Por favor, no incluya información sobre un idioma utilizado en el título de una pregunta a menos que no tenga sentido sin él. Las etiquetas sirven para este propósito. –

+0

editado 18 meses de edad pregunta –

Respuesta

13

Los beneficios son en el uso de objetos anónimos, las consultas LINQ, a veces sobrecarga innecesaria de constructores sólo para pasar parámetros

+0

+1 También permite el tipado implícito para dichos parámetros, en lugar de tener que escribir MyType() {....} nuevo en todas partes. – cirrus

+3

También puede evitar la sobrecarga innecesaria de constructores mediante el uso de parámetros nombrados y opcionales en su constructor: http://msdn.microsoft.com/en-us/library/dd264739.aspx –

89

Uno de los beneficios faltado a menudo es atomicidad. Esto es útil si está usando double-checked locking en un objeto. El inicializador de objeto devuelve el nuevo objeto después de haber inicializado todos los miembros que le indicó. A partir del ejemplo en el artículo de MSDN:

StudentName student = new StudentName 
{ 
    FirstName = "Craig", 
    LastName = "Playstead", 
    ID = 116 
}; 

se traduciría a algo como lo siguiente:

StudentName _tempStudent = new StudentName(); 
_tempStudent.FirstName = "Craig"; 
_tempStudent.LastName = "Playstead"; 
_tempStudent.ID = 116; 

StudentName student = _tempStudent; 

Esto asegura que no se ha inicializado student parcialmente. O bien será null o completamente inicializado, lo cual es útil en escenarios de subprocesos múltiples.

Para obtener más información al respecto, puede consultar el artículo this.

Otra ventaja es que le permite crear objetos anónimos (por ejemplo, para crear una proyección o unir varias teclas en LINQ).

+3

No se conservará la atomicidad si 'FirstName ',' LastName' y 'ID' se inicializaron dentro del constructor' StudentName' – Songo

+2

Sí, lo haría. La declaración anterior sobre atomicidad es para cuando necesita inicializar propiedades de su objeto fuera del constructor. Algunos ejemplos de esto son casos en los que no puede cambiar el código del constructor, o donde su objeto tiene una gran cantidad de propiedades opcionales que desea establecer sin crear docenas de constructores sobrecargados. –

1

Creo que promueve la legibilidad.

Como nota al margen, en el ejemplo dado en el enlace que se muestra, a veces prefiero tener un colocador privado para las propiedades (Nombre y Apellido), pero esto depende de su diseño.

+2

Tu respuesta es un poco confusa. Parece que está sugiriendo usar sintonizadores privados y la sintaxis del intializador de objetos para crear una funcionalidad similar a una propiedad de solo lectura. Si hace que sus setters sean privados, no se pueden usar con sintaxis de inicializador de objetos a menos que lo esté usando en una ubicación que ya tenga acceso a esos setters privados. –

+0

Estoy de acuerdo. Debería haberlo redactado mejor. Para responder al OP, realmente solo estoy diciendo que creo que promueve la legibilidad. El resto de lo que escribí está un poco fuera de tema. He editado el texto para tratar de reflejar esto. – Kirby

21

Existe una posible razón para no usar inicializadores de objeto: Si hay una excepción durante la inicialización, la pila de llamadas en el depurador de Visual Studio devolverá solo la expresión del inicializador y no la línea específica donde ocurrió la excepción.

Si usa librerías o servicios externos que tienen excepciones mal nombradas, o si no usa bibliotecas con código nativo donde no puede ver el código que arroja la excepción (ej. Xamarin en Android), los inicializadores de objetos pueden dificultar depurar su código ya que no sabe qué parámetro provocó la excepción.

Ejemplo: imagine que este es su código, pero que no puede leer el origen de ExternalService ya que es externo a su aplicación. No sabrá que fue el parámetro "charlie" el que causó el error en ExternalService.

var instance = new ClassToBeInitialized 
    { 
     alpha = "alpha", 
     bravo = ExternalService(0), 
     charlie = ExternalService(1) 
    }; 

    private static string ExternalService(int parameter) 
    { 
     if (parameter == 1) 
     { 
      throw new Exception("The external service crashed"); 
     } 

     return "correctStringResult"; 
    } 
+5

Terminé en esta publicación exactamente para verificar si alguien reclama lo mismo. Esto ha sido debatido en mi equipo en las últimas semanas. A mí, como desarrollador, me gusta el azúcar de sintaxis que proporciona (los otros beneficios apuntados anteriormente no son relevantes para mi contexto), pero puedo aceptarlo como una razón lo suficientemente fuerte como para no usarlo (en casos como el mío donde no se beneficia de cualquier otra cosa al usarlo). – Veverke

0

Hay 3 principales beneficios de la inicialización de objetos

  • Evitar la gran cantidad de pulsaciones de teclas, la eficiencia de los programas de software a veces se mide por el número de pulsaciones de teclas que se requiere para escribir una función específica.

  • Fácil de leer y mantener.

  • Enfoque de ahorro de tiempo.

dejan ver aquí cómo se puede evitar la gran cantidad de pulsaciones de teclas:

Antes de C# 3.0 hacíamos inicialización así-

  public class Employee 
     { 
      public string Name { get; set; } 
      public int Id { get; set; } 
      public string Department { get; set; } 
      public int salary { get; set; } 
     } 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       Employee emp=new Employee(); 
       emp.Name = "Kumar"; 
       emp.Department = "IT"; 
       emp.Id = 101; 
       emp.salary = 80000; 
       Console.ReadLine(); 

      } 
     } 

Ahora, después de C# 3.0 vamos a inicializar en una línea como sigue

class Program 
    { 
     static void Main(string[] args) 
     { 
      Employee emp = new Employee {Name = "Kisan",Id = 55,Department = "IT",salary = 20000};   

     } 
    } 
Cuestiones relacionadas