Ответ 1
Создание статического класса просто мешает людям пытаться создать его экземпляр. Если у всех ваших классов есть статические члены, это хорошая практика, чтобы сделать класс статическим.
Возможный дубликат:
Когда использовать статические классы в С#
Я ставил свои классы как статические много, но я не уверен, когда используется статический или нет, или какая разница, которую он делает, чтобы использовать его или нет.
Может кто-нибудь объяснить пожалуйста?
Создание статического класса просто мешает людям пытаться создать его экземпляр. Если у всех ваших классов есть статические члены, это хорошая практика, чтобы сделать класс статическим.
Если класс объявлен как статический, то переменные и методы должны быть обязательно объявлены как статические.
Класс можно объявить статическим, указывая, что он содержит только статические члены. Невозможно создать экземпляры статического класса с использованием нового ключевого слова. Статические классы автоматически загружаются средой общего языка .NET Framework (CLR), когда загружается программа или пространство имен, содержащее класс.
Используйте статический класс для хранения методов, не связанных с определенным объектом. Например, это общее требование для создания набора методов, которые не действуют на данные экземпляра и не связаны с определенным объектом в коде. Вы можете использовать статический класс для хранения этих методов.
- > Основные функции статического класса:
Пример
static class CollegeRegistration
{
//All static member variables
static int nCollegeId; //College Id will be same for all the students studying
static string sCollegeName; //Name will be same
static string sColegeAddress; //Address of the college will also same
//Member functions
public static int GetCollegeId()
{
nCollegeId = 100;
return (nCollegeID);
}
//similarly implementation of others also.
} //class end
public class student
{
int nRollNo;
string sName;
public GetRollNo()
{
nRollNo += 1;
return (nRollNo);
}
//similarly ....
public static void Main()
{
//Not required.
//CollegeRegistration objCollReg= new CollegeRegistration();
//<ClassName>.<MethodName>
int cid= CollegeRegistration.GetCollegeId();
string sname= CollegeRegistration.GetCollegeName();
} //Main end
}
Статические классы могут быть полезны в определенных ситуациях, но есть возможность злоупотреблять и/или злоупотреблять ими, как и большинство языковых функций.
Как уже упоминал Дилан Смит, наиболее очевидным случаем использования статического класса является то, что у вас есть класс только с статическими методами. Нет смысла давать разработчикам возможность создавать такой класс.
Предостережение заключается в том, что чрезмерное использование статических методов может само указывать на недостаток вашей стратегии проектирования. Я нахожу, что когда вы создаете статическую функцию, хорошо спросить себя - лучше ли это было бы соответствовать как a) методу экземпляра, либо b) методу расширения для интерфейса. Идея здесь заключается в том, что поведение объектов обычно связано с состоянием объекта, то есть поведение должно принадлежать объекту. Используя статическую функцию, вы подразумеваете, что поведение не должно принадлежать какому-либо конкретному объекту.
Полиморфная и управляемая интерфейсом конструкция затрудняется из-за использования статических функций - они не могут быть переопределены в производных классах и не могут быть привязаны к интерфейсу. Его обычно лучше использовать ваши "вспомогательные" функции, привязанные к интерфейсу с помощью метода расширения, так что все экземпляры интерфейса имеют доступ к этой общей "вспомогательной" функциональности.
Одна ситуация, когда статические функции определенно полезны, на мой взгляд, заключается в создании метода .Create() или .New() для реализации логики для создания объекта, например, когда вы хотите прокси создать объект,
public class Foo
{
public static Foo New(string fooString)
{
ProxyGenerator generator = new ProxyGenerator();
return (Foo)generator.CreateClassProxy
(typeof(Foo), new object[] { fooString }, new Interceptor());
}
Это можно использовать с прокси-картой (например, Castle Dynamic Proxy), где вы хотите перехватить/вставить функциональность в объект, на основе, скажем, определенных атрибутов, назначенных его методам. Общая идея заключается в том, что вам нужен специальный конструктор, потому что технически вы создаете копию исходного экземпляра со специальной добавленной функциональностью.