Ключове Слово `static`
Важливе ключове слово, з яким ви, ймовірно, вже неодноразово стикалися, — це ключове слово static
. У курсі "Основи C#" згадувалося, що static
використовується при визначенні глобальних змінних — змінних, які знаходяться поза межами будь-якого конкретного методу:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
На той момент це був зручний спосіб описати ключове слово static
, оскільки очікувалося, що читач ще не має знань про об'єкти чи класи. Однак тепер, якщо подивитися на код, можна зрозуміти, що val
— це, по суті, поле класу ConsoleApp
. Зверніть увагу, що клас ConsoleApp
дещо відрізняється від класів, які ви зазвичай створюєте. Це пов'язано з тим, що ConsoleApp
представляє саму програму, і не існує об'єкта класу ConsoleApp
. До цього питання ви ще повернетеся згодом.
Оскільки клас є лише шаблоном, своєрідною порожньою оболонкою, він зазвичай не містить даних сам по собі. Замість цього створюються об'єкти за цим шаблоном, і вже в цих об'єктах зберігаються та отримуються дані — як було пояснено раніше:
index.cs
12345678910111213141516171819202122232425262728using System; class Complex { public int real; public int img; public Complex(int real, int img) { this.real = real; this.img = img; } } class ConsoleApp { static int val = 10; static void Main() { Complex c = new Complex(5, 10); // We can use and update the field of 'c' which is an instance. Console.WriteLine(c.real); c.real = 7; Console.WriteLine(c.real); } }
Навіть всередині класу, коли відбувається доступ до цих полів, доступ здійснюється через об'єкт. Наприклад, у конструкторі фактично використовується дані, які були передані об'єктом, що викликав метод конструктора:
index.cs
12345678public Complex(int real, int img) { // 'int real' and 'int img' contain the data which was passed // 'this.real' refers to the 'real' field of the object which is calling this constructor // same is the case for 'this.img' this.real = real; this.img = img; }
Аналогічно, в інших методах, коли ви звертаєтеся до полів, ви фактично звертаєтеся до полів об'єктів, які викликають ці методи, а не до самої класу, оскільки клас зазвичай не містить жодних даних.
Однак існує спосіб зберігати дані безпосередньо у класі та зробити властивість доступною без необхідності створювати об'єкт. Це можна зробити, просто оголосивши це поле або метод як static
:
index.cs
123456789101112131415161718192021222324252627282930313233343536373839using System; class Complex { public int real; public int img; // A static field can contain data // It is set to private because we don't want it to be manually modifiable from outside // This will track the total number of 'Complex' objects created private static int numbers = 0; public Complex(int real, int img) { this.real = real; this.img = img; numbers += 1; } // A static method // A static method or field can be accessed using the 'ClassName.PropertyName' syntax (see below) public static int getTotalComplexNumbers() { return numbers; } } class ConsoleApp { static void Main() { Console.WriteLine(Complex.getTotalComplexNumbers()); // 0 new Complex(1, 2); Console.WriteLine(Complex.getTotalComplexNumbers()); // 1 new Complex(2, 3); Console.WriteLine(Complex.getTotalComplexNumbers()); // 2 } }
Оскільки ConsoleApp
або головний клас будь-якої програми, який представляє саму програму, не може мати жодних об'єктів, необхідно робити їхні методи та поля статичними. Саме тому метод Main
також є static
:
index.cs
1234static void Main() { // code }
1. Чи може клас безпосередньо зберігати дані?
2. Який правильний синтаксис для зміни поля value
?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Awesome!
Completion rate improved to 2.04
Ключове Слово `static`
Свайпніть щоб показати меню
Важливе ключове слово, з яким ви, ймовірно, вже неодноразово стикалися, — це ключове слово static
. У курсі "Основи C#" згадувалося, що static
використовується при визначенні глобальних змінних — змінних, які знаходяться поза межами будь-якого конкретного методу:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
На той момент це був зручний спосіб описати ключове слово static
, оскільки очікувалося, що читач ще не має знань про об'єкти чи класи. Однак тепер, якщо подивитися на код, можна зрозуміти, що val
— це, по суті, поле класу ConsoleApp
. Зверніть увагу, що клас ConsoleApp
дещо відрізняється від класів, які ви зазвичай створюєте. Це пов'язано з тим, що ConsoleApp
представляє саму програму, і не існує об'єкта класу ConsoleApp
. До цього питання ви ще повернетеся згодом.
Оскільки клас є лише шаблоном, своєрідною порожньою оболонкою, він зазвичай не містить даних сам по собі. Замість цього створюються об'єкти за цим шаблоном, і вже в цих об'єктах зберігаються та отримуються дані — як було пояснено раніше:
index.cs
12345678910111213141516171819202122232425262728using System; class Complex { public int real; public int img; public Complex(int real, int img) { this.real = real; this.img = img; } } class ConsoleApp { static int val = 10; static void Main() { Complex c = new Complex(5, 10); // We can use and update the field of 'c' which is an instance. Console.WriteLine(c.real); c.real = 7; Console.WriteLine(c.real); } }
Навіть всередині класу, коли відбувається доступ до цих полів, доступ здійснюється через об'єкт. Наприклад, у конструкторі фактично використовується дані, які були передані об'єктом, що викликав метод конструктора:
index.cs
12345678public Complex(int real, int img) { // 'int real' and 'int img' contain the data which was passed // 'this.real' refers to the 'real' field of the object which is calling this constructor // same is the case for 'this.img' this.real = real; this.img = img; }
Аналогічно, в інших методах, коли ви звертаєтеся до полів, ви фактично звертаєтеся до полів об'єктів, які викликають ці методи, а не до самої класу, оскільки клас зазвичай не містить жодних даних.
Однак існує спосіб зберігати дані безпосередньо у класі та зробити властивість доступною без необхідності створювати об'єкт. Це можна зробити, просто оголосивши це поле або метод як static
:
index.cs
123456789101112131415161718192021222324252627282930313233343536373839using System; class Complex { public int real; public int img; // A static field can contain data // It is set to private because we don't want it to be manually modifiable from outside // This will track the total number of 'Complex' objects created private static int numbers = 0; public Complex(int real, int img) { this.real = real; this.img = img; numbers += 1; } // A static method // A static method or field can be accessed using the 'ClassName.PropertyName' syntax (see below) public static int getTotalComplexNumbers() { return numbers; } } class ConsoleApp { static void Main() { Console.WriteLine(Complex.getTotalComplexNumbers()); // 0 new Complex(1, 2); Console.WriteLine(Complex.getTotalComplexNumbers()); // 1 new Complex(2, 3); Console.WriteLine(Complex.getTotalComplexNumbers()); // 2 } }
Оскільки ConsoleApp
або головний клас будь-якої програми, який представляє саму програму, не може мати жодних об'єктів, необхідно робити їхні методи та поля статичними. Саме тому метод Main
також є static
:
index.cs
1234static void Main() { // code }
1. Чи може клас безпосередньо зберігати дані?
2. Який правильний синтаксис для зміни поля value
?
Дякуємо за ваш відгук!