Подтвердить что ты не робот

Почему вы не можете объявить статическую структуру в С#, но они могут иметь статические методы?

// OK
struct MyStruct
{
    static void Foo() { }
}

// Error
static struct MyStruct
{
}
4b9b3361

Ответ 1

Поскольку вы не можете создать экземпляр статического типа, поведение static struct будет точно таким же, как поведение static class. Поэтому нет причин для их создания. Я думаю, было бы теоретически возможно иметь static struct, но было бы странно - как бы вы выбрали между static class и static struct, если бы поведение двух было точно таким же?

Обратите внимание, что методы static внутри структуры довольно полезны, поскольку вы можете использовать их для операций, связанных с структурой, например DateTime.TryParse и т.д.

С технической точки зрения я не думаю, что текущий компилятор С# и среда выполнения могут создавать нечто вроде static struct, потому что внутренне (на уровне IL) static class - это класс, который отмечен как abstract и sealed. И я полагаю, что вы не можете создать struct, который был бы abstract и sealed (в IL).

Ответ 2

Я думаю, что ключ, действительно, состоит в том, что struct является типом значения, а не ссылочным типом. Это будет похоже на то, что "для моей всей программы есть только один экземпляр int. Он может иметь разные значения, но только по одному". Кроме того, всякий раз, когда вы передаете структуру как аргумент, она передается по значению, т.е. Копия структуры создается и помещается в стек. Это нарушает цель статического определения - это должно означать, что существует только один экземпляр определяемой вещи. Если то, что вы пытаетесь создать, на самом деле является Singleton, класс - это гораздо лучший способ справиться с этим, поскольку он имеет гораздо лучшую семантику создания, чем структуру.

Ответ 3

Ключевым моментом здесь является то, что статический модификатор класса обеспечивает (среди прочего), что экземпляр класса не может быть создан. Это делается путем принудительного использования частного конструктора.

CLR не может предотвратить создание экземпляра типа структуры. Даже если нет общедоступного конструктора по умолчанию, просто объявить

struct S { }

S[] items = new S[]{1};

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

Обратите внимание, что это отличается от ссылочного типа (класса), где один и тот же код будет создавать ссылку указанного типа (не ссылающуюся на объект, также называемый нулевым), но не экземпляр самого объекта.