Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Ключове Слово `static` | Основи ООП
C# Понад Базовий Рівень

bookКлючове Слово `static`

Важливе ключове слово, з яким ви, ймовірно, вже неодноразово стикалися, — це ключове слово static. У курсі "Основи C#" згадувалося, що static використовується при визначенні глобальних змінних — змінних, які знаходяться поза межами будь-якого конкретного методу:

index.cs

index.cs

copy
1234567891011
using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }

На той момент це був зручний спосіб описати ключове слово static, оскільки очікувалося, що читач ще не має знань про об'єкти чи класи. Однак тепер, якщо подивитися на код, можна зрозуміти, що val — це, по суті, поле класу ConsoleApp. Зверніть увагу, що клас ConsoleApp дещо відрізняється від класів, які ви зазвичай створюєте. Це пов'язано з тим, що ConsoleApp представляє саму програму, і не існує об'єкта класу ConsoleApp. До цього питання ви ще повернетеся згодом.

Оскільки клас є лише шаблоном, своєрідною порожньою оболонкою, він зазвичай не містить даних сам по собі. Замість цього створюються об'єкти за цим шаблоном, і вже в цих об'єктах зберігаються та отримуються дані — як було пояснено раніше:

index.cs

index.cs

copy
12345678910111213141516171819202122232425262728
using 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

index.cs

copy
12345678
public 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

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839
using 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

index.cs

copy
1234
static void Main() { // code }

1. Чи може клас безпосередньо зберігати дані?

2. Який правильний синтаксис для зміни поля value?

question mark

Чи може клас безпосередньо зберігати дані?

Select the correct answer

question mark

Який правильний синтаксис для зміни поля value?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 4. Розділ 5

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Awesome!

Completion rate improved to 2.04

bookКлючове Слово `static`

Свайпніть щоб показати меню

Важливе ключове слово, з яким ви, ймовірно, вже неодноразово стикалися, — це ключове слово static. У курсі "Основи C#" згадувалося, що static використовується при визначенні глобальних змінних — змінних, які знаходяться поза межами будь-якого конкретного методу:

index.cs

index.cs

copy
1234567891011
using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }

На той момент це був зручний спосіб описати ключове слово static, оскільки очікувалося, що читач ще не має знань про об'єкти чи класи. Однак тепер, якщо подивитися на код, можна зрозуміти, що val — це, по суті, поле класу ConsoleApp. Зверніть увагу, що клас ConsoleApp дещо відрізняється від класів, які ви зазвичай створюєте. Це пов'язано з тим, що ConsoleApp представляє саму програму, і не існує об'єкта класу ConsoleApp. До цього питання ви ще повернетеся згодом.

Оскільки клас є лише шаблоном, своєрідною порожньою оболонкою, він зазвичай не містить даних сам по собі. Замість цього створюються об'єкти за цим шаблоном, і вже в цих об'єктах зберігаються та отримуються дані — як було пояснено раніше:

index.cs

index.cs

copy
12345678910111213141516171819202122232425262728
using 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

index.cs

copy
12345678
public 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

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839
using 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

index.cs

copy
1234
static void Main() { // code }

1. Чи може клас безпосередньо зберігати дані?

2. Який правильний синтаксис для зміни поля value?

question mark

Чи може клас безпосередньо зберігати дані?

Select the correct answer

question mark

Який правильний синтаксис для зміни поля value?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 4. Розділ 5
some-alt