Pergunta

Eu vi essas duas coisas ultimamente e estou um pouco confuso.

var blah = new MyClass() { Name = "hello" } 

e

var blah = new MyClass { Name = "hello" } 

Qual é a diferença? e por que eles tanto trabalho?

Update: Quer isto dizer que se eu tiver algo em um construtor que faz alguma computação que eu teria que chamar o primeiro ??

Foi útil?

Solução

Tanto quanto eu sei, eles são exatamente equivalente. A especificação C # (ou pelo menos a implementação da Microsoft da mesma) permite-lhe omitir o () ao usar o construtor padrão (sem parâmetros), enquanto você estiver usando chaves (isto é, a sintaxe para initialisers objeto ). Note-se que o objeto inicializador não faz diferença para o construtor aqui - o new MyClass mordeu ainda é interpretado separadamente como uma chamada para o construtor padrão. Pessoalmente, eu recomendo que você sempre incluir os parênteses () para a consistência -. Você necessidade -los quando você não tem um objeto initializer seguinte

Outras dicas

Não há nenhuma diferença, primeira forma apenas aponta que você são também chamar o construtor:

class Ö {
    public string Ä { get; set; }
    public string Å { get; set; }
    public Ö() { Å = "dear";}
    public Ö(string å) { Å = å; }    
}

Console.WriteLine(new Ö { Ä = "hello" }.Å);
Console.WriteLine(new Ö("world") { Ä = "hello" }.Å);

resultará em:

dear
world

Para adicionar os comentários acima, acrescentando extra é certamente ajudar a esclarecer o construtor ou método init está sendo chamado. Definitivamente um aspecto denominar também ....

Eu acho que eles manter a forma () para inicializadores de objeto porque alguns usuários, como a clareza de () para invocar o construtor, mas IIRC, C ++ (ou as primeiras versões) permitem invocar construtor sem os parênteses. Meu segundo suponho, eles (os designers de linguagem) estão inclinando-se para fazer C # têm JSON-como estrutura, que é kinda limpo, então eles facilitam invocando construtor sem a (). Sou a favor da segunda forma.

Não há nenhuma diferença, assim como a propriedade (embora tão ruim) de VB.NET lhe permitiria variáveis ??atribuir em duas formas: button1.Height = 100 button1.Height () = 1000 kinda coxo, se você pode perguntar.

Na verdade, eles não têm muita diferença até que você lidar com tipos que não têm construtor vazio padrão. Nesse caso você pode obter escrita benefício algo como "novo SomeClass (MandatoryArgument) {Prop1 = 1, Prop2 = 2}"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top