Для структур, я должен вызывать конструктор явно в C #? - PullRequest
4 голосов
/ 05 мая 2010

Вопрос о структурах. Когда я объявляю переменную / объект типа структуры (не знаю, какая из них лучше подходит) или массив или список структур, мне нужно явно вызывать конструктор как объекты, или достаточно просто объявить как переменные?

Ответы [ 2 ]

13 голосов
/ 05 мая 2010

Структуры в C # могут создаваться с или без вызова конструктора. В случае, когда конструктор не вызывается, члены struct будут инициализированы в значения по умолчанию (по существу обнуляется), и struct нельзя использовать, пока все его поля не будут инициализированы.

Из документации:

При создании объекта структуры с помощью новый оператор, он создается и соответствующий конструктор называется. В отличие от классов, структуры могут быть создан без использования нового оператор. Если вы не используете новый, то поля останутся неназначенными, а объект не может быть использован, пока все поля инициализируются.

Ниже приведены некоторые примеры:

struct Bar
{ 
   public int Val;  

   public Bar( int v ) { Val = v; }
}

public void Foo()
{
    Bar z;      // this is legal...
    z.Val = 5;

    Bar q = new Bar(5); // so is this...
    q.Val = 10;

    // using object initialization syntax...
    Bar w = new Bar { Val = 42; }
}

Массивы структур отличаются от одной структурной переменной. Когда вы объявляете массив типа структуры, вы объявляете ссылочную переменную - как таковую, вы должны выделить ее с помощью оператора new:

Bar[] myBars = new Bar[10];  // member structs are initialized to defaults

Вы также можете использовать синтаксис инициализации массива, если ваша структура имеет конструктор:

Bar[] moreBars = new Bar[] { new Bar(1), new Bar(2) };

Вы можете стать более изощренным, чем это. Если ваш struct имеет неявный оператор преобразования из примитивного типа, вы можете инициализировать его следующим образом:

struct Bar
{ 
   public int Val;  

   public Bar( int v ) { Val = v; }

   public static implicit operator Bar( int v )
   {
       return new Bar( v );
   }
}

// array of structs initialized using user-defined implicit converions...
Bar[] evenMoreBars = new Bar[] { 1, 2, 3, 4, 5 };
0 голосов
/ 05 мая 2010

Struct - это Value Type в C #, поэтому он использует стековую память, а не кучу.

Вы можете объявить переменную структуры обычным способом, например, int a = 90;,

int - это тип структуры в c #.

Если вы используете оператор new, то будет вызван соответствующий конструктор.

...