Вот что такое MSDN должен сказать под Когда использовать статические классы:
static class CompanyInfo { public static string GetCompanyName() { return "CompanyName"; } public static string GetCompanyAddress() { return "CompanyAddress"; } //... }Use a static class as a unit of organization for methods not associated with particular objects. Also, a static class can make your implementation simpler and faster because you do not have to create an object in order to call its methods. It is useful to organize the methods inside the class in a meaningful way, such as the methods of the Math class in the System namespace.
Мне кажется, что этот пример не охватывает очень много возможных сценариев использования статических классов. Раньше я использовал статические классы для наборов связанных функций без сохранения состояния, но не об этом. Итак, при каких обстоятельствах следует (и не следует) объявлять класс статическим?
mr5, singleton и static класс - это в основном одно и то же. Синглтон - это шаблон проектирования, используемый в других языках для имитации статического класса, поскольку другие языки (например, Java) не имеют встроенных статических классов, поэтому для создания такого класса вам нужно полагаться на шаблон проектирования Синглтон. Класс Static - это класс, который не может быть создан и может использоваться напрямую (например, класс Console). tutorialspoint.com/design_pattern/singleton_pattern.htm, если вы отметите это, вы увидите, что когда вы используете Singleton, вы не создаете новый экземпляр ...
... вы используете тот, который уже был создан внутри класса Singleton, и получаете к нему доступ с помощью метода .getInstance (). C# решает все это одним простым ключевым словом static.
Одноэлементные и статические классы принципиально противоположны. Один может быть создан, другой - запрещено.
IMHO при разработке атрибутов для объекта подумайте о создании экземпляра для внутри коробки и статического класса для из коробки.





Для C# 3.0 методы расширения могут существовать только в статических классах верхнего уровня.
Я использую только статические классы для вспомогательных методов, но с появлением C# 3.0 я бы предпочел использовать для них методы расширения.
Я редко использую методы статических классов по тем же причинам, по которым я редко использую одноэлементный «шаблон проектирования».
Я бы предпочел не использовать методы расширения для вспомогательных методов. Методы расширения запутаны, сбивают с толку других разработчиков и обычно не интуитивно понятны для других языков. У методов расширения есть свое предназначение, но не как общие вспомогательные методы imho.
Чтобы уточнить, под вспомогательным методом я подразумеваю что-то вроде: string.ToSentence () или string.Camelize (). По сути, все, что могло бы жить в таком классе, как StringHelpers.
Методы расширения ставят вас на скользкую дорожку ... Я думаю, если вы обнаружите, что добавляете более двух методов расширения для данного типа, возможно, пришло время выяснить, почему.
Эти два примера мне особенно не нравятся. Чем более универсален тип, тем меньше он подходит для методов расширения. Худший пример - начало добавления метода ToInt32 () к Object, ToDateTime () и т. д. Я бы предпочел, чтобы они были в отдельных классах.
Я использую статические классы как средство для определения «дополнительных функций», которые объект данного типа может использовать в определенном контексте. Обычно это служебные классы.
Помимо этого, я думаю, что «Используйте статический класс в качестве единицы организации для методов, не связанных с конкретными объектами». достаточно хорошо описать их предполагаемое использование.
Я обычно использую статические классы для фабрик. Например, это класс ведения журнала в одном из моих проектов:
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 вызывается со статическим аксессором. Наиболее того времени для меня, если вы можете вызывать статические методы в классе, это все, что вы можете сделать, поэтому я помечу класс как статический для большей ясности.
Почему вы определяете неиспользуемый параметр в универсальном методе?
@JohnClearZ, возможно, потому, что тогда вы можете вызвать For с существующим объектом и получить для него регистратор, не задумываясь о фактическом типе объекта. Просто догадка.
Если вы используете инструменты анализа кода (например, FxCop), он порекомендует вам пометить метод static, если этот метод не имеет доступа к данным экземпляра. Причина в том, что есть прирост производительности. MSDN: CA1822 - пометить элементы как статические.
На самом деле это скорее рекомендация, чем правило ...
Кроме того, такое статическое объявление частного метода в классе экземпляра передает полезную дополнительную информацию разработчику. Он сообщает, что такой частный статический метод не изменяет состояние экземпляра. метод является служебным методом внутри класса.
Я начал использовать статические классы, когда хочу использовать функции, а не классы, в качестве единицы повторного использования. Раньше я говорил о зле статических классов. Однако изучение F# заставило меня увидеть их в новом свете.
Что я имею в виду? Ну, скажем, работая над каким-то суперкодом СУХОЙ, я получаю кучу классов с одним методом. Я могу просто вывести эти методы в статический класс, а затем внедрить их в зависимости с помощью делегата. Это также хорошо работает с моим контейнером внедрение зависимости (DI) выбора Autofac.
Конечно, прямая зависимость от статического метода по-прежнему является злом как правило (есть некоторые не злые применения).
Решая, делать ли класс статическим или нестатическим, вам нужно посмотреть, какую информацию вы пытаетесь представить. Это влечет за собой более «вверх дном» стиль программирования, когда вы сосредотачиваетесь на данных, которые представляете в первую очередь. Является ли класс, в котором вы пишете, предмет из реального мира, например камень или стул? Эти вещи являются физическими и имеют физические атрибуты, такие как цвет, вес, которые говорят вам, что вы можете создать несколько объектов с разными свойствами. Мне может понадобиться черный стул И красный стул одновременно. Если вам когда-либо понадобятся две конфигурации одновременно, вы сразу узнаете, что хотите создать его экземпляр как объект, чтобы каждый объект мог быть уникальным и существовать одновременно.
С другой стороны, статические функции, как правило, предоставляют больше действий, которые не принадлежат реальному объекту или объекту, который вы можете легко представить. Помните, что предшественниками C# являются C++ и C, где вы можете просто определять глобальные функции, которых нет в классе. Это больше способствует программированию сверху вниз. Статические методы могут использоваться в тех случаях, когда не имеет смысла выполнять задачу «объектом». Вынуждая вас использовать классы, это просто упрощает группировку связанных функций, что помогает вам создавать более удобный в сопровождении код.
Большинство классов могут быть представлены статическими или нестатическими, но если вы сомневаетесь, просто вернитесь к своим корням ООП и попытайтесь подумать о том, что вы представляете. Это объект, выполняющий действие (автомобиль, который может ускоряться, замедляться, поворачивать) или что-то более абстрактное (например, отображение вывода).
Свяжитесь со своим внутренним ООП, и вы никогда не ошибетесь!
«Ты должен быть бесформенным, бесформенным, как вода. Когда вы наливаете воду в чашку, она становится чашкой. Когда вы наливаете воду в бутылку, она становится бутылкой. Когда вы наливаете воду в чайник, он становится чайником. Вода может капать, и он может разбиться. Станьте, как вода, моим другом ». - Брюс Ли
@Chef_Code Мне жаль, что я не мог понять - какое отношение ваша цитата имеет к заданному вопросу, если вы не возражаете, что я спрошу?
Вы можете создавать классы в C++, почти так же, как C#, в этом основное отличие C++ от C.
ОТЛИЧНОЕ объяснение - лучшее, что я видел, с точки зрения простоты и краткости. Я бы порекомендовал этот плюс Марка Расмуссена для более подробной информации всем, кто интересуется этой темой!
Статические классы очень полезны и имеют место, например библиотеки.
Лучшим примером, который я могу предоставить, является класс .Net Math, статический класс пространства имен System, который содержит библиотеку математических функций.
Это похоже на все остальное: используйте правильный инструмент для работы, и если ничем нельзя злоупотреблять.
Бессмысленно отвергать статические классы как неправильные, не использовать их или говорить «может быть только один» или ни одного - так же неправильно, как и использовать их.
C# .Net содержит ряд статических классов, которые используются так же, как класс Math.
Так что при правильной реализации они чрезвычайно полезны.
У нас есть статический класс TimeZone, который содержит ряд функций часового пояса, связанных с бизнесом, нет необходимости создавать несколько экземпляров класса, так как он содержит набор глобально доступных функций (методов) TimeZone, реализованных в статическом классе. .
Ответ «может быть только один» не говорит о количестве статических классов, а довольно мило (хотя и неверно) намекает на тот факт, что может быть только один экземпляр (неверно, потому что на самом деле может быть только ноль экземпляров. )
Ах, спасибо, Кирк, отсюда и мое замешательство; в любом случае простое отклонение статики или общее заявление о том, что шаблон singleton лучше (как я видел), на мой взгляд, убирает очень ценный инструмент из набора инструментов.
«Может быть только один» - это понятия или вещи в реальном мире, которые могут быть представлены статическим классом. Как и в случае с System.Math, вам может потребоваться только один способ принять конкретный ввод и уйти и получить правильный ответ. Может быть только один способ выполнить базовую математику - все остальное слишком специализировано, чтобы быть связанным со стандартной библиотекой. Другим примером может быть простая видеоигра только с одной комнатой или одним игровым полем.
Это еще один старый, но очень острый вопрос с тех пор, как появилось ООП. Конечно, есть много причин использовать (или не использовать) статический класс, и большинство из них охвачено множеством ответов.
Я просто добавлю к этому свои 2 цента, сказав, что я делаю класс статическим, когда этот класс является чем-то уникальным в системе и что действительно не имеет смысла иметь какие-либо его экземпляры в программе. Однако я оставляю это использование для больших классов. Я никогда не объявляю такие маленькие классы, как в примере MSDN, «статическими» и, конечно же, не классами, которые будут членами других классов.
Я также хотел бы отметить, что статический методы и статический классы - это две разные вещи, которые следует учитывать. Основные недостатки, упомянутые в принятом ответе, относятся к статическому методы. static классы предлагает ту же гибкость, что и обычные классы (когда речь идет о свойствах и параметрах), и все используемые в них методы должны соответствовать цели существования класса.
На мой взгляд, хорошим примером кандидата в статический класс является класс FileProcessing, который будет содержать все методы и свойства, относящиеся к различным объектам программы для выполнения сложных операций FileProcessing. Вряд ли имеет смысл иметь более одного экземпляра этого класса, а статичность сделает его легко доступным для всего в вашей программе.
На основе MSDN:
Пример: математические вычисления (математические значения) не меняются [СТАНДАРТНЫЙ РАСЧЕТ ДЛЯ ОПРЕДЕЛЕННЫХ ЗНАЧЕНИЙ]
Вы просто описываете, что такое статический класс является, вместо того, чтобы описывать, когда они будут практичными или каков их цель.
Вопрос в том, когда использовать статический класс, а не в том, что вы можете делать со статическим классом.
Если вы новичок в C#, было бы полезно объяснить, почему этот вопрос был помечен как повторяющийся вопрос синглтон против статического класса и как эти два вопроса соотносятся друг с другом.