c# чем отличается статический класс от нестатического (я говорю о самом классе, а не поле) [дубликат]

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

синтаксис может быть неправильным

public static class Storage
{
    public static string filePath { get; set; }
}

и

public class Storage
{
    private void Storage () {};
    public static string filePath { get; set; }
}

Я получил это из примера в интернете. какая польза от второго один?

7 ответов


Если вы посмотрите на код Il, статический класс будет abstract и sealed что дает два важных качества:

  • вы не можете создавать экземпляры из него
  • он не может быть унаследован

следствием первого пункта является то, что статический класс не может содержать нестатических членов. В нестатическом классе может быть много статических членов. Одно общее использование - иметь фабрику классов:

public class SomeClass
{
    public int SomeInt { get; set; }

    public static SomeClass Create(int defaultValue)
    {
        SomeClass result = new SomeClass();
        result.SomeInt = defaultValue;
        return result;
    }
}

вот официальная / MSDN горячая точка, чтобы узнать о статические классы

основные характеристики статического класса являются:
* Они содержат только статические члены.
* Они не могут быть созданы.
* Они запечатаны.
* Они не могут содержать конструкторы экземпляров

в основном статический класс, совпадает с "нормальной" /non-статический класс, который имеет только статические методы и частный конструктор. Маркировка его как static помогает прояснить намерение и помогает компилятору выполнить некоторые проверки во время компиляции, чтобы запретить определенные вещи, например запретить создание экземпляра.

Real-world использует я могу думать о: используйте его для дома или как способ организовать

  • методы утилиты (методы, не связанные с каким-либо экземпляром типа), например, Math for min и Max methods
  • методы расширения, например, StopWatchExtensions для метода сброса на секундомере

многие классы имеют как экземпляр, так и статические методы. Например строка:

String.Format(string, arg0, arg1, arg2) // static method

и

String myString = "    Hello world!";
myString = myString.Substring(4);       // instance method

Если вы спрашиваете, почему и классу, и методу нужно статическое ключевое слово, это просто по дизайну. Я вижу, что вы спрашиваете, если класс статичен, то, конечно, все методы также статичны, кажется излишним помещать его туда дважды. Не знаю, есть ли для этого веская причина.


статические классы доступны только с C#2 вверх. В C#1 вам нужно будет запечатать свой класс и указать, что он не может быть создан путем добавления частного конструктора для получения такого поведения.


когда вы объявляете класс как static:

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

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


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

public static class Storage
{
   public static string filePath { get; set; }
}

в этом случае класс не должен быть инстанцированным.так же с filepath, он будет занимать уникальное значение класса хранения для всех объект.

public class Storage
{
    private void Storage {};
    public static string filePath { get; set; }
}  

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


Как мы знаем, переменные и функции имеют два типа-экземпляр и класс.

статический класс имеет только переменные класса переменных экземпляра.

следовательно, не может быть создан экземпляр, доступный только по Classname.метод.)(

Он содержит только частные конструкторы, нет открытого конструктора.

статический класс содержит только статические члены.