Предоставленная ссылка Tejs (http://www.jaggersoft.com/pubs/StructsVsClasses.htm) является хорошим объяснением (хотя оно немного устарело, особенно в объяснении событий).
Самое важное практическое отличие состоит в том, что структура является типом значения, то есть она передается по значению , а не по ссылке. На самом деле это означает, что когда структура передается в качестве аргумента, она фактически передается копией. В результате операции над одним экземпляром структуры не влияют на другие экземпляры.
Рассмотрим следующий код:
struct NumberStruct
{
public int Value;
}
class NumberClass
{
public int Value = 0;
}
class Test
{
static void Main()
{
NumberStruct ns1 = new NumberStruct();
NumberStruct ns2 = ns1;
ns2.Value = 42;
NumberClass nc1 = new NumberClass();
NumberClass nc2 = nc1;
nc2.Value = 42;
Console.WriteLine("Struct: {0}, {1}", ns1.Value, ns2.Value);
Console.WriteLine("Class: {0}, {1}", nc1.Value, nc2.Value);
}
}
Поскольку оба ns1
и ns2
имеют тип значения NumberStruct
, у каждого из них есть свое собственное место хранения, поэтому назначение ns2.Number
не влияет на значение ns1.Number
. Однако, поскольку nc1
и nc2
являются ссылочными типами, присвоение nc2.Number
влияет на значение nc1.Number
, поскольку они оба содержат одну и ту же ссылку.
[Отказ от ответственности: приведенный выше код и текст взяты из Sams научите себя Visual C # 2010 за 24 часа ]
Кроме того, как уже отмечали другие, структуры всегда должны быть неизменными. (Да, в этом примере структура является изменчивой, но она должна была проиллюстрировать это.) Часть этого означает, что структуры не должны содержать открытые поля.
Поскольку структуры являются типами значений, вы не можете наследовать от структуры. Вы также не можете получить структуру из базового класса. (Однако структура может реализовывать интерфейсы.)
Структуре также не разрешено иметь явно объявленный открытый конструктор по умолчанию (без параметров). Любые дополнительные конструкторы, которые вы объявляете, должны полностью инициализировать все поля структуры. Структуры также не могут иметь явно объявленного деструктора.
Поскольку структуры являются типами значений, они не должны реализовывать IDisposable
и не должны содержать неуправляемый код.