2012-04-05 3 views
13

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

Например:

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()); 

ответ

16

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

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

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

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

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

3

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

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

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

+0

Отметьте отредактированное сообщение для сценария использования - я вообще задавался вопросом, есть ли разница, используя его без создания экземпляра. –

+0

Обновлено сообщение. –

+4

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

2

Эксплуатационные последствия: в основном нет.

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

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

3

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

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

MyMathLibrary.Plot(...) 

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

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

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

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

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

+0

@Dennis Delimarsky: почему вы говорите: «Мой сценарий использования предел ограничен чем-то вроде ...». Я не вижу его как * ограничение *. Зависит от вашей архитектуры, это может быть * очень хороший * выбор дизайна, четко определяя поведение вашего API. – Tigran

+0

Это всего лишь образец, где я пытался показать, что я не собираюсь на самом деле создавать экземпляр класса. –

Смежные вопросы