static
Ключове слово може бути трохи важко для новачків , щоб зрозуміти. Основна його мета - визначити члена класу як не належного до жодного окремого примірника класу, а замість самого класу.
Не вдаючись до занадто багато деталей, C # (та Java) жорстко застосовують об'єктно-орієнтований ідеал, що всі коди та дані повинні належати об'єкту, а тому обмежені за обсягом, видимістю та терміном експлуатації. Це, як правило, найкраща практика, де застосовується фундаментальний принцип об'єкта, який представляє якусь річ у реальному світі. Однак це не завжди; іноді потрібна функція або змінна, до яких можна дістатися з будь-якого місця в коді, не вимагаючи, щоб ви передавали посилання на об'єкт, що її містить, і гарантуючи, що дані, які ви переглядаєте або змінюєте, точно такі те що всі інше має справу, а не його копія, що належить до іншого екземпляра об'єкта.
Така поведінка була доступна в C і C ++ у вигляді "глобальної" функції або змінної, яка не була інкапсульована в об'єкт. Таким чином, як компроміс, C # і Java підтримують "статичний обсяг", половину шляху між справді глобальним кодом без батьківського об'єкта та членами екземплярів з обмеженою сферою дії.
Будь-який "член коду" (функція, властивість, поле), оголошений як static
потрапляє в область застосування з першого рядка функції програми main()
, і не залишає його, поки main()
функція не припиняється. У звичайній англійській мові статичний член існує і його можна використовувати, поки програма працює. Крім того, статичні члени викликаються, викликаючи їх як членів самого типу, а не членів жодного одного екземпляра цього типу:
public class Foo
{
public int MyInt {get;set;} //this is an "instance member"
public static int MyStaticInt {get;set;} //this is a "static member"
}
...
var myFoo = new Foo();
myFoo.MyInt = 5; //valid
myFoo.MyStaticInt = 5; //invalid; MyStaticInt doesn't belong to any one Foo
Foo.MyInt = 5; //invalid; MyInt only has meaning in the context of an instance
Foo.MyStaticInt = 2; //valid
Це робить статичні члени видимими для будь-якого коду, який має знання про тип, незалежно від того, знають вони про будь-який його екземпляр чи ні.
Щоб відповісти на ваше запитання, головна перевага позначення чого-небудь як статичного полягає в тому, що воно стає видимим там, де відомий сам тип, незалежно від того, чи має спожиючий код або може отримати екземпляр об'єкта, що містить. Також є невеликий користь від продуктивності; оскільки метод знаходиться в статичній області, він може отримати доступ лише до інших статичних членів (того ж класу або інших), і все, що передається в якості параметра. Тому час виконання не повинен вирішувати жодних посилань на поточний екземпляр об'єкта, що міститься, як це зазвичай доводиться застосовувати для методу екземпляра, щоб забезпечити інформацію про стан, що залежить від контексту.
Цілі класи також можуть бути позначені статичними; тим самим ви повідомляєте компілятору, що декларація класу буде складатися виключно з статичних членів, і, таким чином, їх неможливо встановити. Це простий спосіб переконатися, що в пам’яті є одна і лише одна копія об’єкта; зробити клас і все в ньому статичним. Однак дуже рідко це найкраще рішення такої потреби. У ситуації, коли потрібна саме одна копія набору даних, замість цього виступає "синглтон"; це нестатичний клас, який використовує статичний аксесуар та непублічний конструктор для забезпечення доступу до одного екземпляра себе. Теоретично синглтон дає майже однакові переваги повністю статичного класу, але з додатковою можливістю використовувати клас в об'єктно-орієнтованому об'єкті.