2. Статичні методи-члени класу.
Метод класу, визначений із модифікатором static, також є доступним на рівні самого класу, а не його екземплярів. Тобто для виклику такого методу непотрібний жодний екземпляр класу. Прикладом статичного методу є метод Main(), який викликається операційною системою. Зрозуміло, що в момент цього виклику жодного екземпляру жодного класу просто не може існувати. Іншим прикладом статичних методів, які ми неодноразово використовували у прикладах, є методи класу Math або Console – для звертання до них нам не було необхідності створювати відповідний об’єкт. Використання деяких стандартних статичних методів проілюструємо наступним прикладом.
using System;
namespace Static_Method_1
{
class Program
{
static void Main()
{
double d = Math.Exp(-2); // Статичний метод - Exp()
Console.WriteLine(d); // Статичний метод - WriteLine()
// Статичний метод - ToString()
string s = Convert.ToString(129, 2);
Console.WriteLine(s); //s - зображення двійкового числа
Console.WriteLine(Environment.OSVersion);
Console.WriteLine(Environment.UserName);
Console.WriteLine(Environment.ProcessorCount);
Console.WriteLine(Environment.SystemDirectory);
Console.WriteLine(Environment.UserDomainName);
Console.WriteLine(Environment.GetFolderPath(
Environment.SpecialFolder.Desktop));
}
}
}
Зауваження. Зверніть увагу на корисні відомості, які містяться у статичних методах та властивостях класу Environment.
При використанні статичних методів слід пам’ятати про ряд обмежень, а саме:
1. Статичний метод може використовувати лише статичні дані-члени класу, адже статичний метод діє на рівні класу, не маючи доступу до екземплярів , а отже і до змінних екземплярів класу.
2. Статичний метод не може використовувати посилання this.
3. Статичний метод може викликати лише інші статичні методи класу. Щоб звернутись до нестатичного методу, потрібне посилання на екземпляр.
Проілюструємо роботу статичних методів наступними прикладами. В першому з них клас StudyingStatics містить звичайну цілу змінну val та статичну цілу змінну stval із модифікатором private, отже, потрібний метод класу public static int get_(), що повертає її значення. Крім того, конструктор ініціалізує змінну val, а ще один метод public void add1() додає до значення статичної змінної stval значення val.
using System;
namespace Static_Method_2
{
class Program
{
class StudyingStatics
{
public int val;
private static int stval = 10; // статичний член класу
public StudyingStatics(int val_)
{ val = val_; }
// статичний метод повертає значення статичного члену класу
public static int get_()
{ return stval; }
// нестатичний метод використовує як статичні так і
// нестатичні члени класу
public void add1()
{ stval += val; }
}
static void Main()
{
StudyingStatics s = new StudyingStatics(100);
Console.WriteLine("Статична змiнна = {0}",
StudyingStatics.get_());
s.add1(); // метод звертається до статичного члену класу
Console.WriteLine("Статична змiнна = {0}",
StudyingStatics.get_());
}
}
}
Приклад успішно спрацьовує, на екрані з’являються повідомлення:
Статична змiнна = 10
Статична змiнна = 110
Проте спроба включити в клас наступний метод (він відрізняється від add1() лише модифікатором static)
// статичний метод не може звернутись до нестатичного члену
// класу
public static void add2 ()
{ stval += val; }
приводить до синтаксичної помилки – статичний метод звертається до нестатичного члену класу.
У наступному прикладі використаємо той самий клас StudyingStatics, проте включимо у нього два статичних методи – перший інкрементує stval, а другий збільшує stval на значення нестатичного члену класу val екземпляру класу StudyingStatics s, що передається цьому методу. В цьому прикладі жодних проблем не виникає.
using System;
namespace Static_Method_3
{
class StudyingStatics
{
public int val;
private static int stval = 10; // статичний член класу
public StudyingStatics(int val_)
{ val = val_; }
// статичний метод повертає значення статичного члену класу
public static int get_()
{ return stval; }
// статичний метод змінює статичний член класу
public static void incr()
{ stval++; }
// статичний метод звертається до нестатичного члену класу
// через екземпляр
public static void change(StudyingStatics s)
{ stval += s.val; }
}
class Program
{
static void Main()
{
Console.WriteLine(
"stval = {0}", StudyingStatics.get_());
StudyingStatics.incr();
Console.WriteLine(
"stval пiсля incr = {0}", StudyingStatics.get_());
StudyingStatics s = new StudyingStatics(111);
StudyingStatics.change(s);
Console.WriteLine(
"stval пiсля change = {0}", StudyingStatics.get_());
}
}
}
Результатом цього прикладу будуть наступні повідомлення на екрані:
stval = 10
stval пiсля incr = 11
stval пiсля change = 122
|