С# static class зачем использовать?

Возможный дубликат:
Когда использовать статические классы в С#

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

Может кто-нибудь объяснить пожалуйста?

Ответы

Ответ 1

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

Ответ 2

Если класс объявлен как статический, то переменные и методы должны быть обязательно объявлены как статические.

Класс можно объявить статическим, указывая, что он содержит только статические члены. Невозможно создать экземпляры статического класса с использованием нового ключевого слова. Статические классы автоматически загружаются средой общего языка .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
}

Ответ 3

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

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

Предостережение заключается в том, что чрезмерное использование статических методов может само указывать на недостаток вашей стратегии проектирования. Я нахожу, что когда вы создаете статическую функцию, хорошо спросить себя - лучше ли это было бы соответствовать как 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), где вы хотите перехватить/вставить функциональность в объект, на основе, скажем, определенных атрибутов, назначенных его методам. Общая идея заключается в том, что вам нужен специальный конструктор, потому что технически вы создаете копию исходного экземпляра со специальной добавленной функциональностью.