Similar presentations:
Инициализация. Структуры. Свойства (лекция 3)
1.
Инициализация. Структуры.Свойства.
Лекция 3
2.
Ключевое слово thisThis – представляет ссылку на текущий
экземпляр класса.
Используется для обращения из одного
конструктора к другому (передавая нужные
значения для параметров).
Позволяет указывать на имена полей внутри
методов класса.
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.
Использование свойствПравильно инкапсулированный класс должен
защищать свои данные и скрывать подробности
своего устройства от внешнего воздействия (всего
внешнего).
Такой подход называют программированием
черного ящика. Преимущество такого подхода
состоит в том, что объект может свободно
изменять внутреннюю реализацию любого метода
или свойства. Но это не нарушает работу дргих
методов, которые используют эти свойства и
методы. Это обеспечивается неизменностью
сигнатуры методов и идентификаторов свойств
(работа кода, который использует метод или
свойство, не нарушается).