Обяснени статични класове и статични членове на клас в C #

Ключовата дума static в езика за програмиране C # ви позволява да дефинирате статични класове и статични членове.

Статичният клас е подобен на клас, който е едновременно абстрактен и запечатан. Разликата между статичен клас и нестатичен клас е, че статичен клас не може да бъде създаден или наследен и че всички членове на класа са статични по своята същност. За да декларирате клас като статичен, трябва да го маркирате с ключовата дума static в декларацията на класа. 

Няма поведение в статичен клас или член, така че няма смисъл да се позволява и статичен клас да бъде наследен. Статичният клас може да има само статични членове - не можете да декларирате членове на екземпляра (методи, променливи, свойства и т.н.) в статичен клас. Можете да имате статичен конструктор в статичен клас, но не можете да имате конструктор на екземпляр вътре в статичен клас.

Кога да използвам статичен клас в C #

Кога трябва да отидете на статичен клас? Обикновено можете да внедрите помощни или помощни класове като статични класове, тъй като те не се нуждаят от екземпляри или наследяване и обикновено съдържат колекция от многократно използваеми методи и свойства. Следният списък с кодове илюстрира как изглежда статичен клас в C #.

публичен статичен клас FileLogger

    {

        публичен статичен void Log (низ съобщение)

        {

            // Метод за регистриране на данни в текстов файл

        }

    }

Кога да използваме статични методи в C #

Статичните методи са методи, които не се нуждаят от екземпляр на класа, за да бъдат извикани - те могат да бъдат извикани в самия клас. Имайте предвид, че статичните методи имат достъп само до статични членове на класа. Можете да имате статични методи в статичен клас или нестатичен клас. Също така можете да имате статичен конструктор в статичен клас или нестатичен клас. Статичен конструктор се използва за инициализиране на статичните членове на клас. Статичният конструктор на клас се извиква при първия достъп до статичен член на класа.

Защо трябва да използваме статични методи? Те са малко по-бързи в изпълнение от нестатичните методи, т.е. Причината е, че времето за изпълнение предава thisуказателя като неявен параметър към нестатичните или екземплярни методи. Имайте предвид, че за нестатичен метод компилаторът издава callvirtинструкцията, дори ако методът не е виртуален. Ако направите методите си статични, компилаторът излъчва невиртуални callсайтове, премахвайки допълнителната проверка дали екземплярът е нулев. Това може да ви даде някои предимства за ефективността.

Следователно, ако приложението, което създавате, е критично за изпълнението, може да си струва да използвате статични типове и методи във вашия код. Повишаването на производителността може да бъде забележимо, ако вашият код прави голям брой обаждания до такива типове и членове.

Следният кодов фрагмент илюстрира как изглежда статичен метод.

публичен статичен void Log (низ съобщение)

        {

             низ filePath = @ "F: \ Log.txt";

            използвайки (StreamWriter streamWriter = нов StreamWriter (filePath, true))

            {

                streamWriter.WriteLine (съобщение);

                streamWriter.Close ();

            }

        }

Как да използвам статични членове на клас в C #

CLR разделя системната памет на три отделни области: стека, купчината и високочестотната купчина. Тъй като статичните обекти могат да бъдат достъпни директно, без да се създават екземпляри на класа, те трябва да съществуват в паметта през целия живот на приложението; не е нужно да се събират боклуци. Следователно статичните обекти се съхраняват във високочестотната купчина. Обикновено имате по една високочестотна купчина за всеки домейн на приложението.

Нека сега да разгледаме статичните членове на клас. Отново, статичен обект е този, който се запазва в паметта през цялото време, когато приложението е в изпълнение. Разширявайки примера за регистриране по-горе, следният списък с кодове илюстрира как би изглеждал клас FileLogger със статични членове.

публичен статичен клас FileLogger

    {

        частен статичен обект само за четене lockObject = нов обект ();

        публичен статичен низ FilePath

        {

            получи; комплект;

        }

        публичен статичен void Log (низ съобщение)

        {

            заключване (lockObject)

            {

                if (! string.IsNullOrEmpty (FilePath))

                използване (StreamWriter streamWriter = нов StreamWriter (FilePath, вярно))

                {

                    streamWriter.WriteLine (съобщение);

                    streamWriter.Close ();

                }

            }

        }

    }

Обърнете внимание на използването на статичното свойство с име FilePath. За да се осигури безопасност на нишките, lockе използвана ключовата дума. Вътре в Log()метода е направена проверка, за да се провери дали стойността на FilePathсвойството не е нула и не е празна.

Не забравяйте, че когато скоростта на приложението е от съществено значение, може да се изплати използването на статични методи. Можете да ги използвате както в статични класове, така и в нестатични класове.