Как показал опыт платформы Java, которая была разработана задолго до платформы .Net, одной из основных причин ухудшения производительности Java-программ является медленная работа сборщика мусора, вызванная большим количеством мелких объектов в куче. Это явление можно наблюдать в двух случаях:
Интенсивное создание временных объектов с очень малым временем жизни. Зачастую такие объекты создаются и используются в теле одного метода.
Использование гигантских массивов объектов, при котором в массиве хранятся ссылки на огромное количество небольших объектов.
Разработчиками .Net был подмечен тот факт, что использование типов-значений вместо объектов позволяет избежать описанных выше проблем, потому что:
временные значения хранятся не в куче, а непосредственно в локальных переменных метода;
в массивах типов-значений содержатся не ссылки на значения, а непосредственно сами значения.
Поэтому в общую систему типов были добавлены так называемые пользовательские типы-значения. Эти типы могут быть объявлены программистом, но, как и встроенные типы-значения, размещаются не в куче, а в ячейках. Пользовательские типы-значения делятся на структуры и перечисления.
Структуры являются аналогом классов. Они, как и классы, могут содержать поля, методы, свойства и события. Все структуры неявно наследуют от библиотечного класса System.ValueType, и, более того, встроенные типы-значения также наследуют от этого класса. Cистема типов не предусматривает никакого наследования структур, кроме данного неявного. Другими словами, структуры не могут наследоваться друг от друга и, тем более, не могут наследоваться от классов (кроме System.ValueType).
Перечисления представляют собой структуры с одним целочисленным полем Value. Кроме того, перечисления содержат набор констант, определяющих возможные значения поля Value. При этом для каждой константы в перечислении хранится ее имя. Перечисления неявно наследуют от библиотечного класса System.Enum, который, в свою очередь, является наследником все того же класса System.ValueType.