Касательно вопросов по структурам, то все они достаточно просты.
Ну к примеру.
Вопрос: что такое структура?
Ответ: структура – это тип. Тип-значения. Значимый тип. Я еще называю значимые типы стековыми типами, так проще понимать.
Вопрос: для чего используются структуры?
Ответ: чаще для обычной группировки логически связанных переменных и не более того. К примеру 3D-координаты точки представляются переменными x, y, z. Естественно, логично эти три переменные хранить в некотором контейнере. Можно было создать класс Point и разместить в нем свойства X, Y, Z. Но создавать целый класс и размещать его в куче для каки-нибудь трех простецких переменных уж сильно расточительно. Для этих целей лучше создать структуру.
Вопрос: чем структуры лучше классов?
Ответ: структуры не лучше и не хуже классов. Для небольших типов, не предназначенных для инкапсулирования законченного набора данных, подойдут структуры, для всех остальных случаев – классы. Если вам трудно сделать выбор между классом и структурой, выбирайте класс. В принципе, можете вообще забыть о пользовательских структурах, сама Microsoft так и советует отдавать предпочтение классам. Конечно, важно все таки понимать, что внешне структуры напоминают классы, однако принцип их размещения в памяти существенно отличается, что уже само по себе накладывает разные задачи на класс и структуру как таковые.
Однако, есть все же одно обстоятельство, в определенные моменты награждающее структуры преимущество перед классами – немедленное удаление объекта по выходу из блока видимости:
public void Method()
{
MyStruct myStruct = new MyStruct();
}
//здесь myStruct уже не существует,
//он был вытолкнут из стека.
Как видим, если в данном методе при создании объекта использовался тип класса, а не структуры, то объект myStruct после завершения работы метода еще продолжал бы висеть в куче, ожидая сборщика мусора, что в некоторых случаях является не желательным.
Вопрос: как насчет наследования в структурах?
Ответ: структуры не могут наследовать другие структуры и не могут сами быть наследуемыми. Одним словом, структуры не поддерживают наследование. Соответственно, структуры не могут быть помечены модификатором доступа protected – наследования то нет. Однако структуры могут реализовывать интерфейсы.
Вопрос: выходит, структуры создаются как классы, а их объекты с помощью ключевого слова new ?
Ответ: да, оздание структур идентично созданию класса, только вместо ключевого слова class используется struct:
Struct MyStruct
{
public int x, y, z;
}
Создать объект типа MyStruct:
MyStruct myStruct = new MyStruct();
В этом случае в стеке создастся группа переменных x, y, z и их значения будут содержать 0.
Заметьте, что структуры можно определить конструктор, но только с параметрами. Никак нельзя определить конструктор не принимающий параметров.
Если вы удивились в использовании оператора new при создании объекта структуры,
то знайте, что оператор new для значимых (стековых) типов работает иначе, нежели для ссылочных типов.
В нашем случае не происходит выделение памяти в куче под объект, а просто поля структуры размещаются в стеке.
Кстати, обратите внимание на валидную запись int i = new int();
Написав так мы одним махов создаем в стеке переменную i и заносим в неё значение 0. Єта запись єквивалентна int i = 0;
Оператор new для значимих типов – это всего лиш синтаксическая уловка.
Ввиду этого, создать объект структуры возможно и так:
MyStruct myStruct;
Однако, перед использованием объекта нам вручную необходимо занести значения в поля объекта, хотя бы нули:
myStruct.x = 0; myStruct.y = 0; myStruct.z = 0;
Еще запомните, что для структур можно определить методы Dispose() и Close(),
однако деструктор через переопределение метода Finalize() не поддерживается.
Вопрос: как насчет передачи структур в методы?
Ответ: исходя из тех соображений, что структуры являются значимыми типа,
передача их в методы по умолчанию происходит по значению и изменения с переданными данными
внутри метода не отобразятся на исходном объекте, в отличие от объектов классов.