635.53K
Category: programmingprogramming

Инициализация. Структуры. Свойства (лекция 3)

1.

Инициализация. Структуры.
Свойства.
Лекция 3

2.

Ключевое слово this
This – представляет ссылку на текущий
экземпляр класса.
Используется для обращения из одного
конструктора к другому (передавая нужные
значения для параметров).
Позволяет указывать на имена полей внутри
методов класса.

3.

Ключевое слово this
Можно не дублировать функциональность конструкторов, а просто обращаться из
одного конструктора к другому через ключевое слово this, передавая нужные
значения для параметров

4.

Ключевое слово this
Чтобы разграничить параметры (метода) и поля класса, к полям класса обращение
идет через ключевое слово this.
В выражении this.name = name;
часть this.name означает, что name – это поле текущего класса, а не название
параметра name. Если бы у нас параметры и поля назывались по-разному, то
использовать слово this было бы необязательно.
Также через ключевое слово this можно обращаться к любому методу.

5.

Инициализаторы объектов
Инициализаторы представляют передачу в фигурных скобках значений
доступным полям и свойствам объекта. С помощью инициализатора
объектов можно присваивать значения всем доступным полям и
свойствам объекта в момент создания без явного вызова конструктора.
Person obj 1= new Person { name = "Иван", age=31 };
При использовании инициализаторов следует учитывать следующие
моменты:
• С помощью инициализатора можно установить значения только
доступных из внешнего кода полей и свойств объекта. Например, в
примере выше поля name и age имеют модификатор доступа public,
поэтому они доступны из любой части программы.
• Инициализатор выполняется после конструктора, поэтому если и в
конструкторе, и в инициализаторе устанавливаются значения одних и
тех же параметров, то последние изменения будут за
инициализаторами.

6.

Спецификаторы доступа
В C# применяются следующие модификаторы доступа:
• public: публичный, общедоступный класс или член класса. Такой член класса
доступен из любого места в коде, а также из других программ и сборок.
• private: закрытый класс или член класса. Представляет полную
противоположность модификатору public. Такой закрытый класс или член
класса доступен только из кода в том же классе.
• protected: такой член класса доступен из любого места в текущем классе или
в производных классах. При этом производные классы могут располагаться в
других сборках (файлах).
• internal: класс и члены класса с подобным модификатором доступны из
любого места кода в том же файле, однако он недоступен для других
программ или файлов этой же программы (как в случае с модификатором
public).
• protected internal: совмещает функционал двух модификаторов. Классы и
члены класса с таким модификатором доступны из текущего файла и из
производных классов.
• private protected: такой член класса доступен из любого места в текущем
классе или в производных классах, которые определены в том же файле.

7.

Спецификаторы доступа
Объявление полей и методов класса без
модификатора доступа равнозначно их
объявлению с модификатором private.
Классы, объявленные без модификатора, по
умолчанию имеют доступ internal.

8.

Класс – Ссылочный тип!
Классы относятся к ссылочным типам
данных. Это означает, что объекты
конкретного класса доступны по
ссылке.
Ссылка -это 32/64-х битный адрес,
указывающий на расположение членовданных в управляемой куче, в отличие
от значений простых типов,
доступных непосредственно.

9.

Ссылочный тип данных
using System;
class Point{
int x, y;
public Point(int x =0, int y =0)
{
this.x = x;
this.y = y;
}
public void print(){
Console.Write("\n x="+x.ToString()+
" y="+y.ToString());
}
public void newXY(int x, int y){
this.x=x;
this.y=y;
}
}
class Program
{
public static void chenge(Point A, int x){
A.newXY(-3, 4);
x = 15;
}
public static void Main()
{
Point B = new Point(1, -1);
int C = -5;
B.print();
Console.Write("\n C = {0}", C);
chenge(B,C);
B.print();
Console.Write("\n C = {0}", C);
Console.ReadKey(true);
}
}}

10.

Структуры
• Каждый доступ к объектам по ссылке связан с
дополнительными издержками на расход
вычислительных ресурсов и оперативной
памяти.
• Для разрешения подобных затруднений в C#
предусмотрена структура, которая подобна
классу, но относится к типу значений, а не к
ссылочному типу данных.
struct имя_структуры
{
объявления членов (как у класса)
}
Структуры отличаются от классов некоторыми свойствами
(например, структуры не поддерживают наследование).

11.

Структуры
• В структурах допускается также определять
конструкторы.
• Для структуры нельзя определить конструктор по
умолчанию (без параметров), который
определяется для всех структур автоматически и
не подлежит изменению. (Такой конструктор
инициализирует поля структуры значениями,
задаваемыми по умолчанию (false для типа bool, 0 – для
чисел)).
• Экземпляр («объект») структуры может быть создан
с помощью оператора new (как и объект класса).
Когда используется оператор new, то вызывается
конструктор, используемый по умолчанию. А когда этот
оператор не используется, объект по-прежнему создается,
хотя и не инициализируется (придется выполнить
вручную).

12.

Структуры

13.

Структуры
Вызов конструктора по умолчанию, который
создается автоматически

14.

Отличие Структур от Классов

15.

Конструктор по умолчанию для Классов реализован также как
и для Структур

16.

Отличие
Структур от
Классов
Типы значений и
ссылочные типы

17.

Отличие Структур от Классов

18.

Свойства
Вся функциональность класса представлена его членами:
Полями (полями называются переменные класса),
Свойствами,
Методами,
Конструкторами,
Событиями и др. определениями.
Спецификатор_видимости Тип Имя_свойства {
set {проверка на допустимость изменения}
get {необходимые преобразования и возвращение
значения установленного Типа }
}

19.

Объявили класс со
свойством
Свойства
class Person{
uint age;
public uint Age{
set {
if ( value>15 && value<=65 )
age = value;
Использование
}
свойств
get {
class Program{
return age;
public static void Main(){
}
Person A = new
}
Person();
…….
A.Age = 62; //ok
}
A.Age = 67; //no

20.

Объявили класс со
свойством
Свойства
class Person{
DateTime begin;
public DateTime Begin{
set {
if ( value>DateTime.Now)
begin = value;
}
get { return begin; }
}
public DateTime End{
get {
return begin.AddDays(7);
}
}
public string info{
get{
return begin.ToString()+”….”;
}
}
…….
}
Использование
свойств
class Program{
public static void Main(){
Person A = new Person();
A.Begin = new DateTime(2020,12,31);
Console.WriteLine(A.Begin.AddDays(1));
Console.WriteLine(A.End);
…..

21.

Пример
использования
свойств

22.

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

23.

Свойства, доступные только для
чтения и только для записи
• При инкапсуляции данных может
понадобиться сконфигурировать свойство,
доступное только для чтения. Для этого
нужно просто опустить блок set.
• Аналогично, если требуется создать
свойство, доступное только для записи,
следует опустить блок get. Например, в
нашем пример отсутствует блок set для
свойства info.

24.

Отдельные модификаторы доступа
для блоков свойства
class Person
{
private string name;
public string Name
{
get
{
return name;
}
private set
{
name = value;
}
}
public Person(string name)
{
Name = name;
}}
Теперь закрытый блок set можно
использовать только в данном классе в его методах, свойствах, конструкторе,
но никак не в другом классе

25.

Отдельные модификаторы доступа
для блоков свойства
Можно применять модификаторы доступа не только ко всему свойству, но и к
отдельным блокам - либо get, либо set:
При использовании модификаторов в свойствах следует учитывать
ряд ограничений:
• Модификатор для блока set или get можно установить, если
свойство имеет оба блока (и set, и get)
• Только один блок set или get может иметь модификатор
доступа, но не оба сразу
• Модификатор доступа блока set или get должен быть более
ограничивающим, чем модификатор доступа свойства.
Например, если свойство имеет модификатор public, то блок
set/get может иметь только модификаторы protected internal,
internal, protected, private.

26.

Использование свойств
• Инкапсуляция предоставляет способ обеспечения
целостности данных о состоянии объекта.
• Вместо определения открытых полей (которые
легко приводят к повреждению данных),
необходимо выработать привычку определения
закрытых данных, управление которыми
осуществляется опосредованно, с применением
одного из двух главных приемов:
• определение двух открытых методов доступа
и изменения;
• определение открытого свойства.

27.

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