Qual é a diferença entre um inicializador de object e um construtor?

Quais são as diferenças entre os dois e quando você usaria um “inicializador de objects” sobre um “construtor” e vice-versa? Eu estou trabalhando com c #, se isso importa. Além disso, o método de inicializador de object é específico para C # ou .NET?

Inicializadores de object foram algo adicionados ao C # 3, para simplificar a construção de objects quando você está usando um object.

Os construtores são executados, recebem 0 ou mais parâmetros e são usados ​​para criar e inicializar um object antes que o método de chamada obtenha o identificador para o object criado. Por exemplo:

MyObject myObjectInstance = new MyObject(param1, param2); 

Neste caso, o construtor de MyObject será executado com os valores param1 e param2 . Ambos são usados ​​para criar o novo MyObject na memory. O object criado (que é configurado usando esses parâmetros) é retornado e definido como myObjectInstance .

Em geral, é considerado uma boa prática ter um construtor que exija os parâmetros necessários para configurar completamente um object, de modo que seja impossível criar um object em um estado inválido.

No entanto, muitas vezes há propriedades “extras” que podem ser definidas, mas não são necessárias. Isso pode ser feito através de construtores sobrecarregados, mas leva a ter muitos construtores que não são necessariamente úteis na maioria das circunstâncias.

Isso leva a inicializadores de objects – Um Object Initializer permite definir propriedades ou campos em seu object depois que ele é construído, mas antes que você possa usá-lo por qualquer outra coisa. Por exemplo:

 MyObject myObjectInstance = new MyObject(param1, param2) { MyProperty = someUsefulValue }; 

Isso vai se comportar da mesma maneira como se você fizesse isso:

 MyObject myObjectInstance = new MyObject(param1, param2); myObjectInstance.MyProperty = someUsefulValue; 

No entanto, em ambientes multi-threaded a atomicidade do inicializador de object pode ser benéfica, pois impede que o object esteja em um estado não totalmente inicializado (veja esta resposta para mais detalhes) – é nulo ou inicializado como você pretendia.

Além disso, os inicializadores de object são mais simples de ler (especialmente quando você define vários valores), portanto, eles oferecem o mesmo benefício que muitas sobrecargas no construtor, sem a necessidade de ter muitas sobrecargas complicando a API dessa class.

Um construtor é um método definido em um tipo que recebe um número especificado de parâmetros e é usado para criar e inicializar um object.

Um inicializador de object é um código que é executado em um object após um construtor e pode ser usado para definir sucintamente qualquer número de campos no object para os valores especificados. A configuração desses campos ocorre depois que o construtor é chamado.

Você usaria um construtor sem a ajuda de um inicializador de object se o construtor configurasse suficientemente o estado inicial do object. No entanto, um inicializador de object deve ser usado em conjunto com um construtor. A syntax requer o uso explícito ou implícito (VB.Net e C #) de um construtor para criar o object inicial. Você usaria um inicializador de object quando o construtor não inicializasse suficientemente o object para o seu uso e alguns conjuntos de campos e / ou propriedades simples o tornariam.

Quando você faz

 Person p = new Person { Name = "a", Age = 23 }; 

Isso é o que um inicializador de object essencialmente faz:

 Person tmp = new Person(); //creates temp object calling default constructor tmp.Name = "a"; tmp.Age = 23; p = tmp; 

Agora isso facilita um comportamento como esse . Saber como os inicializadores de object funcionam é importante.

Se você tem propriedades que DEVEM ser definidas em seu object para funcionar corretamente, uma maneira é expor apenas um único construtor que requer essas propriedades obrigatórias como parâmetros.

Nesse caso, você não pode criar seu object sem especificar essas propriedades obrigatórias. Algo assim não pode ser imposto pelos inicializadores de objects.

Inicializadores de object são realmente apenas uma “conveniência de syntax” para encurtar as atribuições iniciais. Bom, mas não muito funcionalmente relevante.

Marc

Um construtor é um método (possivelmente) aceitando parâmetros e retornando uma nova instância de uma class. Pode conter lógica de boot. Abaixo você pode ver um exemplo de um construtor.

 public class Foo { private SomeClass s; public Foo(string s) { s = new SomeClass(s); } } 

Agora considere o seguinte exemplo:

 public class Foo { public SomeClass s { get; set; } public Foo() {} } 

Você poderia obter o mesmo resultado que no primeiro exemplo usando um inicializador de object, supondo que você possa acessar SomeClass, com o seguinte código:

 new Foo() { s = new SomeClass(someString) } 

Como você pode ver, um inicializador de object permite que você especifique valores para campos públicos e propriedades públicas (configuráveis) ao mesmo tempo que a construção é executada, e isso é especialmente útil quando o construtor não fornece nenhuma sobrecarga ao inicializar determinados campos. Por favor, lembre-se, no entanto, que os inicializadores de object são apenas açúcar sintático e que, após a compilation, não serão realmente diferentes de uma sequência de atribuições.