статические - статический конструктор c#




Когда использовать статические классы в C# (8)

Для C # 3.0 методы расширения могут существовать только в статических классах верхнего уровня.

На этот вопрос уже есть ответ:

Вот что говорит MSDN в разделе « Когда использовать статические классы» :

static class CompanyInfo
{
    public static string GetCompanyName() { return "CompanyName"; }
    public static string GetCompanyAddress() { return "CompanyAddress"; }
    //...
}

Используйте статический класс как единицу организации для методов, не связанных с конкретными объектами. Кроме того, статический класс может сделать вашу реализацию проще и быстрее, потому что вам не нужно создавать объект, чтобы вызвать его методы. Полезно организовать методы внутри класса значимым образом, такие как методы класса Math в пространстве имен System.

Для меня этот пример, похоже, не охватывает очень много возможных сценариев использования для статических классов. Раньше я использовал статические классы для аффилированных наборов связанных функций, но об этом. Итак, при каких обстоятельствах должен (и не должен) класс объявляться статическим?


Если вы используете инструменты анализа кода (например, FxCop ), рекомендуется пометить метод static если этот метод не имеет доступа к данным экземпляра. Обоснование заключается в том, что есть выигрыш в производительности. MSDN: CA1822 - Отметить элементы как статические .

Это скорее руководство, чем правило, действительно ...


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

С другой стороны, статические функции, как правило, придают больше действиям, которые не принадлежат объекту реального мира или объекту, который вы можете легко представить. Помните, что предшественниками C # являются C ++ и C, где вы можете просто определить глобальные функции, которые не существуют в классе. Это дает больше возможностей для программирования « сверху вниз ». Статические методы могут использоваться для этих случаев, когда не имеет смысла, что «объект» выполняет задачу. Заставляя вас использовать классы, это упрощает группировку связанных функций, которые помогают создавать более удобный код.

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

Свяжитесь с вашим внутренним ООП, и вы никогда не ошибетесь!


Статические классы очень полезны и имеют место, например библиотеки.

Лучшим примером, который я могу предоставить, является класс .Net Math, статический класс пространства имен System, который содержит библиотеку математических функций.

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

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

C # .Net содержит ряд статических классов, которые используются так же, как класс Math.

Поэтому, учитывая правильную реализацию, они чрезвычайно полезны.

У нас есть статический класс TimeZone, который содержит ряд связанных с бизнесом функций часового пояса, нет необходимости создавать несколько экземпляров класса, так же, как класс Math, он содержит набор доступных в глобальном масштабе функций (методов) TimeZone в статическом классе ,


Я использую статические классы как средство определения «дополнительной функциональности», которую объект определенного типа может использовать в определенном контексте. Обычно они оказываются полезными классами.

Помимо этого, я думаю, что «Использовать статический класс как единицу организации для методов, не связанных с конкретными объектами». достаточно хорошо описывают их предполагаемое использование.


Я использую только статические классы для вспомогательных методов, но с появлением C # 3.0 я бы предпочел использовать для них методы расширения.

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


Я начал использовать статические классы, когда хочу использовать функции, а не классы, как свою единицу повторного использования. Раньше я был все о зле статических классов. Однако изучение F# заставило меня увидеть их в новом свете.

Что я имею в виду? Ну, скажем, при обработке какого-то супер DRY кода я получаю кучу одномерных классов. Я могу просто привести эти методы в статический класс, а затем применить их к зависимостям с помощью делегата. Это также прекрасно сочетается с моим контейнером для инъекций зависимостей (DI) Autofac.

Конечно, прямая зависимость от статического метода все еще обычно зла (есть некоторые незломысленные виды использования).


Я обычно использую статические классы для фабрик. Например, это класс журнала в одном из моих проектов:

public static class Log
{
   private static readonly ILoggerFactory _loggerFactory =
      IoC.Resolve<ILoggerFactory>();

   public static ILogger For<T>(T instance)
   {
      return For(typeof(T));
   }

   public static ILogger For(Type type)
   {
      return _loggerFactory.GetLoggerFor(type);
   }
}

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





static