Круглые скобки или нет? Какая разница? - PullRequest
3 голосов
/ 21 марта 2009

Я видел эти две вещи в последнее время, и я немного запутался.

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

и

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

Какая разница? и почему они оба работают?

Обновление: Означает ли это, что если у меня есть что-то в конструкторе, который выполняет вычисления, которые я должен был бы вызвать первым ??

Ответы [ 5 ]

15 голосов
/ 21 марта 2009

Насколько я знаю, они в точности эквивалентны. Спецификация C # (или, по крайней мере, ее реализация Microsoft) позволяет вам опустить () при использовании конструктора по умолчанию (без параметров), если вы используете фигурные скобки (то есть синтаксис для инициализаторов объектов ). Обратите внимание, что здесь инициализатор объекта не имеет никакого значения для конструктора - бит new MyClass по-прежнему интерпретируется отдельно как вызов конструктора по умолчанию. Лично я бы порекомендовал вам всегда включать круглые скобки () для согласованности - вам нужно их, если у вас нет инициализатора объекта после.

3 голосов
/ 21 марта 2009

Разницы нет, первая форма просто указывает, что вы также вызываете конструктор:

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

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

приведет к:

dear
world
1 голос
/ 21 марта 2009

На самом деле они не имеют большой разницы, пока вы не разберетесь с типами, которые не имеют пустого конструктора по умолчанию. В таком случае вы можете получить выгоду, написав что-то вроде «new SomeClass (MandatoryArgument) {Prop1 = 1, Prop2 = 2}»

1 голос
/ 21 марта 2009

Я предполагаю, что они сохраняют форму () для инициализаторов объектов, потому что некоторым пользователям нравится ясность () для вызова конструктора, но iirc, C ++ (или первые версии) позволяют вызывать конструктор без скобок. Мое второе предположение, что они (дизайнеры языка) склоняются к тому, чтобы C # имел JSON-подобную структуру, что довольно удобно, поэтому они облегчают вызов конструктора без (). Я предпочитаю вторую форму.

Нет никакой разницы, так же как свойство (хотя и плохое) VB.NET позволит вам назначать переменные в двух формах: button1.Height = 100 button1.Height () = 1000 Kinda lame, если вы можете спросить

1 голос
/ 21 марта 2009

Чтобы добавить к вышеупомянутым комментариям, добавление extra определенно поможет уточнить, какой конструктор или метод init вызывается. Определенно аспект стиля также ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...