Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции C# Часть1 A5.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1 Мб
Скачать
☆

Статические элементы

В ходе изучения данного пособия Вы должны усвоить объектно-ориентированный стиль программирования. Кратко это можно описать таким образом.

1. Сначала создайте классы – полезные правила для создания объектов.

2. Далее создавайте объекты – экземпляры этих классов и заставляйте их выполнять нужную Вам работу.

Таким образом в процессе выполнения программы непосредственно действуют объекты. Однако в некоторых случаях естественнее считать, что действия выполняются самим классом. Хорошим примером является класс Math – все его методы вызываются от имени класса:

Console.WriteLine(Math.Sin(0.5)+Math.Cos(0.5));

Было бы довольно странно для вычисления математических функций сначала создавать объект-«математику»:

Math m1=new Math();

Console.WriteLine(m1.Sin(0.5)+m2.Cos(0.5));

Это означало бы, что можно создавать несколько «математик». Но ведь они все должны действовать абсолютно одинаково.

Аналогично дело обстоит и с переменными – бывают случаи, когда некоторые данные естественнее представлять не как порцию информации, принадлежащую объекту, а классу в целом. В классе Math эта ситуация встречается при доступе к тригонометрической константе  - Math.PI.

Элементы класса (переменные и методы), которые соотносятся не с объектами, а с классом, называются статическими. В описании статических элементов используется ключевое слово static. В отличие от статических членов обычные элементы класса называются элементами экземпляров класса – методы экземпляров и переменные экземпляров.

Переменные экземпляра описываются в классе и хранятся в объектах класса. Статические переменные описываются и хранятся (в единственном числе) в классе, как показано на следующем рисунке:

Рассмотрим следующий пример. Класс Person моделирует ситуацию, когда множество людей располагают некоторым общим запасом пищи и делят его поровну. Количество пищи FoodQuantity и количество людей PeopleCount – характеристики всей совокупности людей. Поэтому они описаны как статические переменные. Метод Description описывает состояние всего множества людей и также является статическим методом.

class Person

{ public static double FoodQuantity = 100.0;

public static int PeopleCount = 0;

public double Weight;

public Person()

{ Weight = 10.0; PeopleCount++; }

public void ToEat()

{ double t = FoodQuantity / 2.0 / PeopleCount;

Weight += t; FoodQuantity -= t;

}

public static string Description()

{ return String.Format("Людей - {0} Еды - {1}",

PeopleCount,FoodQuantity);

}

}

class Program

{ static void Main(string[] args)

{ Person p1 = new Person(); p1.ToEat();

Console.WriteLine("Вес p1 - {0}", p1.Weight);

Console.WriteLine(Person.Description());

Person p2 = new Person(); Person p3 = new Person();

p1.ToEat(); Console.WriteLine("Вес p1 - {0}",p1.Weight);

Console.WriteLine(Person.Description());

}

}

Статические методы могут использовать только статические переменные и другие статические методы класса. Попытка использовать в методе Description переменную Weight привела бы к ошибке компилятора.

Для инициализации статических переменных можно использовать статический конструктор:

static Person()

{ FoodQuantity = 100.0; PeopleCount = 0; }

Если в начале изучения языка C# не сразу используются его объектно-ориентированные возможности, структура программы выглядит примерно следующим образом:

class Program

{ static void Main(string[] args)

{ Do1();

Console.WriteLine(Do2());

}

static void Do1() { Console.WriteLine("метод Do1"); }

static string Do2() { return "метод Do2"; }

}

Таким образом, можно не обращать внимания на наличие в программе класса Program. Программа сстоит из нескольких статических методов, которые вызываются в «главном» методе Main.