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

Разница на низком уровне: нестатический класс со статическим методом против статического класса со статическим методом

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

Например:

class NonStaticClass
{
    public static string GetData()
    {
        return "This was invoked from a non-static class.";
    }
}

В сравнении с этим:

static class StaticClass
{
    public static string GetData()
    {
        return "This was invoked from a static class.";
    }
}

Каковы последствия производительности/памяти для использования одного метода над другим?

ПРИМЕЧАНИЕ: Предположим, что мне не нужно создавать экземпляр класса. В моем сценарии использования есть что-то вроде этого:

Console.WriteLine(NonStaticClass.GetData());
Console.WriteLine(StaticClass.GetData());
4b9b3361

Ответ 1

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

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

На уровне clr нет понятия static. Статический класс - это abstract и sealed, что эффективно предотвращает наследование и создание экземпляров.

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

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

Ответ 2

Есть некоторые особенности/ограничения:

  • вы не можете создать статический класс
  • вы не можете наследовать статический класс

Итак, если вы предполагаете такое поведение для своего класса (например, вспомогательный/утилиты или контейнер методов расширения), если вы хотите ограничить его использование - сделайте его static.

Ответ 3

Нет никаких преимуществ или недостатков. Это просто архитектурное решение.

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

MyMathLibrary.Plot(...)

Эти типы обычно подразумевают меньшее поведение. Повторяю, обычно.

Используйте простые классы со статическими членами, когда у вас есть "обычный" тип, но каким-то образом нужен способ без учета состояния, например:

public class MyType
{
    .... //some members 

    public static MyType ReadFromXml(XmlReader reader) {}
    public static void SaveToXml(MyType mt) {}
}

Нет серебряной пули, это просто вопрос выбора архитектора.

Ответ 4

Последствия для производительности: в основном нет.

Вы можете создать экземпляр NonStaticClass, но поскольку он не имеет нестатических методов переопределения, он так же полезен, как и выражение object obj = new object(), то есть полезно для блокировки и для этого. Создание статического класса препятствует тому, чтобы кто-то из него начинал, но это не так, как это делает какой-либо реальный вред.

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