2016-03-03 2 views
0

Могу ли я создать объект на месте? То, что я имею в виду, когда у меня есть следующий класс, который принимает два параметраСоздать объект на месте

class Foo { 
    public Foo(int x, int y) {} 
} 

и следующий метод, который принимает Foo объект

public void do(Foo foo) {} 

можно затем написать что-то вроде этого

do({1,2}); 

вместо этого

do(new Foo(1,2)); 

Это было бы особенно полезно, если бы у Foo было действительно длинное имя и было окружено несколькими пространствами имен.

+2

"* Затем я могу написать что-то вроде этого *" - нет, вы не можете. Таких «сокращений» для создания объектов в C# нет. –

+0

Возможно, если вы перекодируете компилятор .net C#, вы можете :-) – brothers28

+0

@ AndyKorneyev: Спасибо, это позор. Я исхожу из C++-фона, вот почему я спрашиваю. – gartenriese

ответ

0

Короткий ответ

Нет, вы не можете. Существует только конструкция для инициализации свойства/поля, например:

new Foo() { a = 2, b = 3 }.

Более длинный ответ

Это может просить вопрос "почему не"? Ну, я хотел бы рассмотреть этот сценарий:

public class Bar : Foo 
{ 
    public Bar(int a, int b) : Foo(a, b) {} 
} 

// ... 
List<Bar> list; 

// ... 
list.Add({1,2}); 

Теперь, вы в какой-то момент вы решили, что это немного странно иметь «Бар» там в списке, так что вы измените подпись списка List<Foo> list;. Теперь ваш код сломается, потому что другой конструктор теперь является «по умолчанию».

+0

Зачем это ломается? Если другой конструктор имеет одинаковые параметры, он не должен меняться? – gartenriese

+0

Если конструктор Foo нужно называть 'Foo (b, a)', у вас есть ошибка. – rene

+0

@rene: Это не так, как ответ написан. – gartenriese

1

Нет, что невозможно. Однако если проблема связана с длинными именами, вы можете попробовать использовать директиву alias.

using F = A.Very.Long.Namespace.and.classname.FooBarThing; 

// ... 
List<Bar> list; 

// ... 
list.Add(new F(1,2)); 

см https://msdn.microsoft.com/en-us/library/aa664765(v=vs.71).aspx

Смежные вопросы