Почему статические структуры не разрешены в C#? [дубликат]

этот вопрос уже есть ответ здесь:

Я всегда рассматривал структуры как какие-то менее привилегированные вещи или что-то с меньшими функциями. Может быть, из-за концепций ООП, дующих все в Занятия.

из небольшого количества воздействия на C# я понимаю, что установка класса static гарантирует, что все его члены и функции статичны. Также мы не можем иметь конструктор для инициализации этого класса есть только один экземпляр.

public static struct mystruct
{
    public static int a;
}

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

Я получил соответствующую ошибку, сказав: "статический недопустим для этого элемента", когда я создал новый cs файл & скомпилирован в консоли. Странно, когда я добавил Это в существующий рабочий проект, чтобы увидеть, будет ли компилятор жаловаться, но, к моему удивлению, это не так. Есть причины для этого??

7 ответов


статический класс - это просто контейнер для статических членов (любого рода-полей, событий, свойств и наиболее распространенных методов).

статическая структура будет точно такой же, поэтому не будет предоставлять никаких преимуществ , но читатели могут думаю это имело какое-то особое значение. Чтобы избежать путаницы, это запрещено. Концептуально это имеет такой же смысл, как и статический класс, конечно-разница между структурами и классами действительно в том, как экземпляров из них ведут себя, и поскольку не было бы экземпляров статических типов любого типа, эта разница была бы спорной.

(Не то, чтобы я был на совещании по дизайну, где это было решено, конечно. Эрик Липперт вполне может найти кое-какие заметки об этом. Вышеизложенное-всего лишь обоснованная догадка. Аннотированная спецификация C# 3 молчит по этому вопросу, насколько я могу видеть.)


Это ничего не дает. У вас все равно будет коллекция статических методов, как и у статического класса. Структура в C# подразумевает, что это тип значения вместо ссылочного типа, который не имеет значения на статическом уровне.


файл, который находится в разделе "это просто так". Поскольку вы можете сделать это со статическим классом, нет причин разрешать статические структуры. Это просто сбило бы людей с толку, в чем разница между ними. Они должны были выбрать то или другое.


также мы не можем иметь конструктор, чтобы инициализируйте этот класс, поскольку есть только единичный случай.

на самом деле, есть нет экземпляр статического класса. Что объясняет отсутствие поддержки статических структур - или, скорее, отсутствие каких-либо нужно для такой вещи.

различие между ссылочными типами и типами значений в .NET (class и struct в C#) полностью о том, как экземпляров из этих типов обрабатываются. Доступ к экземпляру ссылочного типа осуществляется через ссылка к этому экземпляру в виде переменной. Копии таких ссылок передаются между вызовами метода. Доступ к экземпляру типа значения осуществляется напрямую, а копии самого экземпляра передаются между вызовами метода.

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


Нет Инициализаторов Полей Экземпляра

в классе нам разрешено создавать поле / переменную и инициализировать ее, в то же время структура не может содержать такую инициализацию. Эти поля должны быть инициализированы с помощью функций или с помощью самого объекта. Поля не могут быть заданы начальные значения во время создания. Следующий код выдает ошибку:

struct Point
{ 
    public int x = 20; // Error its not possible to initialize
    public int y=20; // Error its not possible to initialize
} 

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

struct  Point  {
        public static int x = 25;
        public static int y = 50;
}

Структура И Методы

структура C# также может содержать методы. Методы могут быть статическими или нестатическими. Но статические методы могут обращаться только к другим статическим членам, и они не могут вызывать с помощью объекта структуры. Они могут вызвать только с помощью имени класса.

struct Point  
{    
    static int x = 25;    
    static int y = 50;
    public void SetXY(int i, int j)    
    {        
        x = i;        
        y = j;    
    }     

    public static void ShowSum()            
    {        
        int sum = x + y;        
        Console.WriteLine("The sum is {0}",sum);    
    }
}

как найти на "http://www.csharpfriends.com/articles/getarticle.aspx?articleid=120"


понятие статических типов не имеет смысла для структур. структуры подразумевают семантику копирования по значению , что имеет смысл только тогда, когда вы можете создать экземпляр типа. Статические классы были введены, чтобы упростить группирование статических методов в типе,который не может быть создан. Разрешение статических структур было бы избыточным и запутанным.

подумайте об этом таким образом. Как бы static class Foo и static struct Foo отличаются в поведении? А если нет ... зачем вводить static struct концепция вообще? Это может только запутать людей думать, что есть разница...


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

статический класс уже определяет ту же способность.