remarks name generate c# .net memory-management

c# - name - ¿Hay algún beneficio de usar un Inicializador de objetos?



remarks c# (5)

Creo que promueve la legibilidad.

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

¿Hay algún beneficio en el uso de los inicializadores de objetos C #?

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 para su uso en C #?

Cómo: Inicializar objetos utilizando un inicializador de objetos (Guía de programación C #)


Existe una posible razón para no usar los inicializadores de objetos: 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 alternativamente usa librerías 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 la depuración de su código desde no sabe qué parámetro provocó que se lanzara la excepción.

Ejemplo: Imagine que este es su código, pero que no puede leer el origen de ExternalService porque 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"; }


Hay 3 beneficios principales de la inicialización de objetos

  • Evite muchas pulsaciones de teclas. La eficacia de los programas de software a veces se mide por la cantidad de teclas que requiere para escribir una función específica.

  • Fácil de leer y mantener.

  • Enfoque de ahorro de tiempo.

Veamos aquí cómo puede evitar muchas pulsaciones de teclas:

Antes de c # 3.0 estábamos haciendo una inicialización como esta-

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, nos inicializaremos en una línea de la siguiente manera.

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


Los beneficios están en el uso de objetos anónimos, consultas linq, a veces una sobrecarga innecesaria de constructores solo para pasar parámetros


Un beneficio que a menudo se pierde es la atomicidad . Esto es útil si está utilizando el bloqueo con doble verificación en un objeto. El inicializador de objeto devuelve el nuevo objeto después de haber inicializado todos los miembros que le indicó. Del ejemplo en el artículo de MSDN:

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

Sería traducido a algo como lo siguiente:

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

Esto asegura que el student nunca se inicializa parcialmente. Será null o completamente inicializado, lo cual es útil en escenarios de múltiples subprocesos.

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

Otro beneficio es que le permite crear objetos anónimos (por ejemplo, para crear una proyección o para unirse a varias claves en LINQ).