24 votos

¿Cuál es la forma preferida de construir objetos en C#? ¿Parámetros del constructor o propiedades?

Me preguntaba, ¿cuál es la forma preferida para la construcción de un nuevo objeto en C#?

Tomar una clase de Persona:

public class Person 
{
    private string name;
    private int age;

    //Omitted..
}

Debo crear para que se utilice:

New Person("name", 24);

o

New Person() { Name = "name", Age = 24 };

Es sólo una cuestión de gusto o es que hay una buena razón para utilizar uno sobre el otro?

Me imagino que uno sólo debe utilizar los campos requeridos en el constructor y campos opcionales no como los parámetros del constructor, pero mediante el uso de propiedades.

Estoy en lo cierto en eso?

35voto

Jeff Yates Puntos 36725

La forma preferida depende de su diseño.

Constructor de propiedades para los elementos que su objeto requiere para ser construido correctamente. Es decir, las propiedades del objeto debe tener para ser inicializado necesidad de estar en el constructor (que normalmente no quieren que una parte intialized objeto después de que el constructor es llamado a menos que usted es la creación de una fábrica o el generador de patrón y el constructor está oculto de todos, pero la fábrica/el generador).

Propiedad intializers son los mejores para una configuración adicional después de un constructor que se requiere por parte de su caso de uso en particular, pero no es necesario para que el objeto pueda ser considerado inicializadas.

Por ejemplo, usted podría tener un objeto que representa a una persona. Una persona necesita un nombre y una edad para ser inicializadas, pero la dirección en la que vivo es una configuración opcional. Así, el nombre y la edad son los parámetros del constructor, y la dirección es una propiedad de lectura/escritura.

Person johnDoe = new Person("John Doe", 24) { Address = "42 Adams Street" };

11voto

Marc Gravell Puntos 482669

Realmente depende de la situación. La propiedad cuenta con un lote de conveniencia, en la que usted no tiene que duplicar las asignaciones en el constructor. Además, la mayoría de los escenarios de enlace de datos como para ser capaz de crear nuevos objetos, por lo que suelen utilizar el constructor sin parámetros, por lo que es una gran ventaja.

Sin embargo, para inmutable tipos, el constructor de enfoque es la única opción sensata. Curiosamente (tal vez) el nombre de la/parámetros opcionales en C# 4.0 permite algo similar a objeto initalizers para inmutable tipos - ver aquí.

El constructor de enfoque también es muy popular para la Inversión de los marcos de Control, como claramente se anuncia lo que las necesidades de la clase en el fin de la función.

Usted puede necesitar para mezclar y combinar, pero por lo general más propiedad de estilo de constructor de estilo.

6voto

BarneyHDog Puntos 322

Yo siempre trabajo sobre la base de que debe pasar valores a un constructor, que son obligatorios para que ese objeto existe en un estado válido.

En el ejemplo se podría decir que la nueva persona no existe sin una edad por lo que debe ser aprobada en el contructor.

Si usted trabaja sobre la base de que un objeto de modelo de un verdadero trabajo de la entidad, a continuación, que determina el mínimo necesario para hacer que cualquier objeto válido - si se establece los valores predeterminados o por el paso de valores a través del constructor.

5voto

Frederik Gheysels Puntos 36354

Establecer los valores en el constructor, hace esas propiedades obligatorias, esto significa que no se puede crear una nueva instancia, sin configuración de las propiedades. En algunas situaciones es preferible, en otros casos esto no es prefferable.

4voto

Kai Wang Puntos 1500

Un par de ideas:

  1. Usted necesita las propiedades públicas para el uso de Inicializadores de Objeto. Así que si hay algo que usted no desea exponer, se tiene que inicializar por parámetro del constructor.

  2. Si usted llega IL, encontrarás el Inicializador de Objeto no es "atómica". Si escribe un código como este (no es que yo lo recomiendo, es sólo un ejemplo):

    using (p = New Person() {Name = GetName(), Age = GetAge()})
    {
      //blah, blah
    }
    

    Si hay una excepción en GetAge(), va a crear una instancia de Person en un estado corrupto. Peor aún, nunca se puede introducir el uso de alcance y que la instancia no se ha dispuesto como se podría imaginar.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X