criando parâmetros de objeto em {}?


14

Estou tentando decodificar um pedaço de código de um livro:

List<Person> people = new List<Person>()
{
new Person {FirstName="Homer",LastName="Simpson",Age=47},
new Person {FirstName="Marge",LastName="Simpson",Age=45}
};

A pessoa é apenas uma classe simples que eles criaram, com vários campos: Nome, Sobrenome, etc ...

O que não entendo é que não enviamos parâmetros para um construtor de Person entre colchetes não encaracolados? Eu tentei replicar esse código, mas ele não parece voar, tomadores?

Obrigado pela contribuição.



1
"Tentei replicar esse código, mas ele não parece voar" <- você precisa usar o C # 3 (VS 2008) ou posterior para que esta sintaxe esteja disponível.
AakashM

Esteja ciente das diferenças entre os dois conceitos: Inicialização de Objetos e População de Objetos. Em geral, você faz a inicialização no construtor. O método do seu exemplo é melhor usado para população e não para inicialização.
NoChance 30/10/12

Respostas:


27

O C # permite especificar parâmetros de propriedade entre chaves quando o objeto é inicializado. Isso permite escolher quais itens inicializar e quais deixar como padrão.

Um construtor, por outro lado, executa um único bloco de código com um conjunto fixo de parâmetros. Portanto, para obter o mesmo efeito, seria necessário criar vários construtores, todos com as várias combinações de propriedades que você deseja inicializar, o que pode ser entediante.

var x = new Person {FirstName="Homer",LastName="Simpson",Age=47}; 

é exatamente equivalente a isso:

var x = new Person();
x.FirstName="Homer";
x.LastName="Simpson";
x.Age=47;

Só que é mais curto e mais fácil para os olhos.

Ele também permite construções como você demonstrou na sua pergunta, o que seria muito tedioso se você tivesse que criar variáveis ​​temporárias e inicializá-las como fiz aqui antes de adicioná-las à lista. (É assim que você costumava fazer isso.) Tudo isso sem exigir um construtor definido explicitamente que leva a lista de parâmetros desejada, que pode ou não estar disponível.

Além disso, observe que, embora um construtor possa inicializar propriedades com um setter privado, essa técnica (como deve ser óbvio no exemplo fornecido) funcionará apenas se você tiver um setter público para a propriedade. Observe também que meu exemplo abreviado implicitamente chamou o construtor padrão (sem parâmetros), que, portanto, precisaria estar presente.


Pode valer a pena acrescentar que, devido a isso, as propriedades inicializadas entre chaves devem ser publicamente configuráveis.
Yam Marcovic

@YamMarcovic ah. sim. Nota adicionada a esse efeito.
tylerl

2
Ah, sou esclarecido, excelente explicação.
RealityDysfunction

2
Para obter um efeito muito semelhante com um único construtor, você pode tornar todos os seus parâmetros opcionais. Em seguida, você poderia fazer algo assim new Person(lastName: "Simpson"), deixando de fora os firstNamee ageparâmetros.
svick

Esta não aborda porque você não pode apenas passar os para o construtor, ou sejavar x = new Person("Homer", "Simpson", 47);
rayray
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.