399.40K
Категория: ПрограммированиеПрограммирование

Статические члены класса (лекция 4)

1.

Статические члены класса.
Лекция 4

2.

Повторение
Использование свойств
Правильно инкапсулированный класс должен
защищать свои данные и скрывать подробности
своего устройства от внешнего воздействия (всего
внешнего).
Такой подход называют программированием
черного ящика. Преимущество такого подхода
состоит в том, что объект может свободно
изменять внутреннюю реализацию любого метода
или свойства. Но это не нарушает работу дргих
методов, которые используют эти свойства и
методы. Это обеспечивается неизменностью
сигнатуры методов и идентификаторов свойств
(работа кода, который использует метод или
свойство, не нарушается).

3.

Замечание
Автоматические свойства
Если необхожимо создать свойство, которое будет
простым отображением get и set в закрытое поле, без
добавления чего-либо:
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
То в этом случае целесообразно создать только
актоматическое свойсто, которое заменит весь
программный код, написанный выше:
public string Name { get; set; }

4.

Замечание
Строки
• Объект String является неизменяемым.
Каждый раз при использовании одного из методов в
классе System.String вы создаете объект строки в памяти, для которого
требуется выделение новой области (пространства).
• В случаях, когда необходимо выполнять повторяющиеся изменения
строки, издержки, связанные с созданием объекта String, могут
оказаться значительными. Чтобы изменять строку без создания нового
объекта, можно использовать класс System.Text.StringBuilder.
Использование класса StringBuilder может повысить
производительность при соединении большого количества строк в цикле.
// пример использования объекта String
string s1 = "text ";
for (int i=0; i<N; i++) s1 += Console.Readline();
s1=s1.ToUpper();
System.Console.WriteLine(s1);
// пример использования объекта StringBuilder
StringBuilder S1 = new StringBuilder();
for (int i=0; i<N; i++) s1.Append( Console.Readline());

5.

Замечание
Объект класса StringBuilder

6.

Статические поля (свойства)
Требуется определить такое поле класса, которое будет
использоваться независимо от его объектов.
Данное поле характеризует класс, а не конкретный его экземпляр.
Значение данного поля – одно (единое) для всех его объектов.
Примеры:
• Верхняя граица изменения показателя влажности для сущности
Земельная Единица.
• Количество объектов класса, созданных в программе.
• Максимальная длина отрезка (по всем экземплярам класса
Отрезок).

7.

Статические поля (свойства)
Синтаксис объявления статического поля:

спецификатор_видимости static тип имя_поля [= начальное_значение];
class Segment{
int x, y;
public static ushort count_obj = 0;//кол-во объектов
public Segment(){
x=y=0;
count_obj++;
}
public Segment(int x, int y){this.x=x; this.y=y;}
public void Draw(){}
public void info(){}
}

8.

Статические поля (свойства)
Синтаксис получения (вызова) статического поля:

Название_класс.Имя_статического_Поля
class Program{
public static void Main()
{
Console.WriteLine("Количество отрезков : {0}",
Segment.count_obj);
}
Для того чтобы воспользоваться членом типа static за пределами класса,
достаточно указать имя этого класса с оператором «точка». Cоздавать
объект для этого не нужно. В действительности член типа static
оказывается доступным не по ссылке на объект,
а по имени своего класса.

9.

Статические поля (свойства)
Переменные, объявляемые как static, по существу,
являются глобальными.
Когда же объекты объявляются в своем классе, то копия
переменной типа static не создается.
Вместо этого все экземпляры класса совместно
пользуются одной и той же переменной типа static.
Такая переменная должна быть инициализирована
перед использованием класса.
На уровне памяти для статических полей будет создаваться участок в
памяти, который будет общим для всех объектов класса.
Память для статических переменных выделяется даже в том случае,
если не создано ни одного объекта этого класса.

10.

Пример.
Статическое поле
class Student{
public static int max_ball=0;
int[] balls= new int[3];
public string Name{get; set;};
public Student(string name, int math, int phis, int lang){
this.Name=name;
balls[0]=math; balls[1]=phis; balls[2]=lang;
max_ball=(summa_balls()>max_ball)? summa_balls():max_ball;
}
public int summa_balls(){
return balls[0]+balls[1]+balls[2];
}
}
class Program{
public static void Main(string[] args) {
Student R = new Student("y", 12, 45, 7);
Student R1 = new Student(“x", 12, 45, 70);
//Student.max_ball+=10;
Console.WriteLine(“макс балл : {0}", Student.max_ball);
}}

11.

Статический метод
Метод, который не привязан к конкретному экземпляру
класса (не связан со свойствами или полями класса), а
предназначен для выполненения манипуляций со
статическми членами или передаваемыми параметрами.
Таким примером служит метод Main(), который
объявляется таковым потому, что он должен вызываться
операционной системой в самом начале выполняемой
программы.

12.

Пример. Статический метод.
class Circle
{
// площадь и длину круга
public static double SquareCircle(int R)
{
return Math.PI * R * R;
}
}
public static double LengthCircle(int R)
{
return 2 * Math.PI * R;
}

Console.WriteLine("Круг: Радиус {0}, площадь {1},
длина {2}", 5, Circle.SquareCircle(5),Circle.LengthCircle(5));

13.

Статический метод
• В методе типа static должна отсутствовать ссылка
this, поскольку такой метод не выполняется
относительно какого-либо объекта.
• В методе типа static допускается непосредственный
вызов только других методов типа static, но не
метода экземпляра из того самого же класса. Дело
в том, что методы экземпляра оперируют
конкретными объектами, а метод типа static не
вызывается для объекта. Следовательно, у такого
метода отсутствуют объекты, которыми он мог бы
оперировать.

14.

Статическое свойство
Открытое статическое поле – нарушает принцип инкапсусяции;
Проблема выделения памяти для автоматического свойства (инициализация)

15.

Статическое свойство
Решение проблемы:
1) Открытое статичесское свойство только для чтения (для закрытого
статического поля) позволяет решить проблему некорректного
измения открытого статического поля.
2) Открытый статический метод для доступа к закрытому статическому
полю.
class Student{

static int max_ball = 0;
public static int Max_ball{
get {return max_ball;}
}
public static int Get_max_ball(){ return max_ball;}
….
}
//изменение статического поля невозможно вне методов класса Student

Student.max_ball +=10; //error
Student.Max_ball =10; //error

16.

Статическое свойство
Автоматитические статические свойства и поля
должны быть проинициализированы.
Для полей и свойств, которые относятся к типам
значениям (базовые типы или структуры) происходит
автоматическая инициализация некоторыми
начальными значениями,
а вот для ссылочных типов необходимо
позаботиться:
выделить динамическую память и
вызвать конструктор (инициализация).
В данном примере была ошибка: память для соответствующего поля не была
выделена.
Возникает вопрос: как и где выделить память для поля, которое обслуживает
автоматическое свойство?
public static StringBuilder All_balls{get; set;}

17.

Статический конструктор
Кроме обычных конструкторов у класса также могут быть
статические конструкторы. Статические конструкторы имеют
следующие отличительные черты:
1.
2.
3.
4.
Статические конструкторы не должны иметь модификатор
доступа и не принимают параметров.
Как и в статических методах, в статических конструкторах
нельзя использовать ключевое слово this для ссылки на
текущий объект класса и можно обращаться только к
статическим членам класса.
Статические конструкторы нельзя вызвать в программе
вручную. Они выполняются автоматически при самом первом
создании объекта данного класса или при первом обращении
к его статическим членам (если таковые имеются).
Статические конструкторы обычно используются для
инициализации статических данных, либо же выполняют
действия, которые требуется выполнить только один раз.

18.

Статический конструктор
Отличие от обычного конструктора:
Обычный конструктор используетс для
установки значений данных для объекта во
время его создания.
Что будет происходить при попытке
присваивания начального значение
статическому элементу данных в обычном
конструкторе?

19.

Статическое свойство. Статический
конструктор.

20.

Статический класс
Если класс определен как статический:
• для такого класса нельзя создать объект,
• такой класс может включать в себя только
статичесие члены (поля, свойство,
методы…).
Если это правило нарушить, возникнет
ошибка компиляции.

21.

Статический класс
Класc (или структура), который обеспечивает
только статическую функциональность, часто
называют обслуживающим.
На первый взгляд может показаться странным:
невозможность создания экземпляров класса. Однако
следует учесть, что класс, не содержащий ничего кроме
статических членов и/или константных данных, и не
нуждается в выделении памяти.

22.

Пример. Обслуживающий класс.

23.

Перечисление (enum)
Перечисление – определяемый пользователем целочисленный тип, который
позволяет задавать набор допустимых значений, и назначить каждому
понятное имя.
Синтаксис объявления перечисления:
enum [имя_перечисления] { [имя1], [имя2], … };
Пример объявления:
enum Profession {инженер, наладчик, слесарь, инженерТБ, машинист,
водитель, служащий};
enum types {сельхоз_назначение=10, насел_пункт, водный_фонд=13,
лесной_фонд=15, ООПТ=12};

24.

Перечисление (enum)

25.

https://youtu.be/zzFG-WxDrO0
English     Русский Правила