Платформа Microsoft и С# (шарп) язык программирования

Содержание

Слайд 2

Референсы!

Книги!

Платформа Microsoft и С# (шарп) язык программирования.

https://drive.google.com/drive/folders/1YO2Bq5xYDYo5VPyYTPTq0gyG4RyTH5oh?usp=sharing

Референсы! Книги! Платформа Microsoft и С# (шарп) язык программирования. https://drive.google.com/drive/folders/1YO2Bq5xYDYo5VPyYTPTq0gyG4RyTH5oh?usp=sharing

Слайд 3

Референсы!

Видео!

ИНТЕРЕСНО!!!

C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ

https://youtu.be/KyFWqbRfWIA

3

Уроки C# (C sharp) | #1 -

Референсы! Видео! ИНТЕРЕСНО!!! C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ https://youtu.be/KyFWqbRfWIA 3 Уроки C#
Что такое C# и зачем он нужен?

https://youtu.be/3FWqP80fNJM

Создание игры “Space Invaders” на C# с нуля

https://youtu.be/Zw8DVvmutGc

Как стать C# разработчиком в 2021 году.
.NET или .NET Core?

https://youtu.be/z8XrqlOcjD0

Платформа Microsoft и С# (шарп) язык программирования.

!

Слайд 4

https://vscode.ru/category/articles

Референсы!

Статьи!

4

https://tproger.ru/tag/c-sharp/

Полезные материалы по языку от Microsoft и уроки для начинающих C#-программистов.

https://habr.com/ru/company/microsoft/blog/573426/

Поддержка нескольких

https://vscode.ru/category/articles Референсы! Статьи! 4 https://tproger.ru/tag/c-sharp/ Полезные материалы по языку от Microsoft и
репозиториев в Visual Studio

Документация по C#

https://docs.microsoft.com/ru-ru/dotnet/csharp/

Статьи по C# и .NET

https://metanit.com/sharp/articles/

Программирование на C, C# и Java

Платформа Microsoft и С# (шарп) язык программирования.

Слайд 5

Экзамен!

Платформа Microsoft и С# (шарп) язык программирования.

Экзамен! Платформа Microsoft и С# (шарп) язык программирования.

Слайд 6

Экзамен!

Платформа Microsoft и С# (шарп) язык программирования.

Экзамен! Платформа Microsoft и С# (шарп) язык программирования.

Слайд 7

Референсы!

Перегрузка
операторов

Платформа Microsoft и С# (шарп) язык программирования.

Референсы! Перегрузка операторов Платформа Microsoft и С# (шарп) язык программирования.

Слайд 8

Введение
в перегрузку операторов!

Платформа Microsoft и С# (шарп) язык программирования.

Перегрузка операторов представляет собой

Введение в перегрузку операторов! Платформа Microsoft и С# (шарп) язык программирования. Перегрузка
механизм определения стандартных операций для пользовательских типов. Для встроенных типов языка C# перегрузка стандартных операторов уже реализована, и ее изменить невозможно. Например, в классе System.String перегрузка операторов == и != используется для проверки равенства и неравенства строк по их содержимому, а оператор + перегружен и выполняет конкатенацию строк. Хочется обратить Ваше внимание, что перегрузка операторов является одним из способов полиморфизма, например, применяя операцию + к числовым типам, мы получим значение их суммы, а применяя ее же со строками, получим конкатенацию строк.

Слайд 9

Введение
в перегрузку операторов!

Платформа Microsoft и С# (шарп) язык программирования.

Перегрузка операторов используется для

Введение в перегрузку операторов! Платформа Microsoft и С# (шарп) язык программирования. Перегрузка
улучшения читабельности программ и должна соответствовать определенным требованиям:
■ перегрузка операторов должна выполняться открытыми статическими методами класса;
■ у метода-оператора тип возвращаемого значения или одного из параметров должен совпадать с типом, в котором выполняется перегрузка оператора;
■ параметры метода-оператора не должны включать модификатор out и ref.

Слайд 10

Перегрузка
унарных операторов

Платформа Microsoft и С# (шарп) язык программирования.

Синтаксис перегрузки выглядит следующим образом.

Перегрузка унарных операторов Платформа Microsoft и С# (шарп) язык программирования. Синтаксис перегрузки
Поскольку перегруженные операторы являются статическими методами, они не получают указателя this, поэтому унарные операторы должны получать единственный операнд. Этот операнд должен иметь тип класса, в котором выполняется перегрузка оператора. То есть, если выполняется перегрузка унарного оператора в классе Point, то и тип операнда должен быть Point. Рассмотрим перегрузку унарных операторов на примере операторов инкремента, декремента и изменения знака –. Для операторов ++ и -- возвращаемое значение должно быть того же типа, в котором выполняется перегрузка оператора или производного от него. Класс Point описывает точку на плоскости с координатами x и y. Оператор инкремента увеличивает обе координаты на 1, оператор декремента соответственно уменьшает на 1, оператор — изменяет знак координат на противоположный.

Слайд 11

Перегрузка
унарных операторов

Платформа Microsoft и С# (шарп) язык программирования.

В данном примере Point является

Перегрузка унарных операторов Платформа Microsoft и С# (шарп) язык программирования. В данном
ссылочным типом, поэтому изменения значений x и y, которые выполняются в перегруженных операторах инкремента и декремента, изменяют переданный в них объект. Оператор — (изменение знака) не должен изменять состояние переданного объекта, а должен возвращать новый объект с измененным знаком. Для этого в реализации этого метода создается новый объект Point, изменяется знак его координат и этот объект возвращается из метода.

using static System.Console;
namespace SimpleProject
{
class Point
{
public int X { get; set; }
public int Y { get; set; }
//перегрузка инкремента
public static Point operator ++(Point s)
{
s.X++;
s.Y++;
return s;
}
//перегрузка декремента
public static Point operator --(Point s)
{
s.X--;
s.Y--;
return s;
}
//перегрузка оператора -
public static Point operator -(Point s)
{
return new Point { X = -s.X, Y = -s.Y };
}
public override string ToString()
{
return $"Point: X = {X}, Y = {Y}";
}
}

class Program
{
static void Main()
{
Point point = new Point { X = 10, Y = 10 };
WriteLine($"Исходная точка\n{point}");
WriteLine("Префиксная и постфиксная формы инкремента выполняются одинаково");
WriteLine(++point); // x=11, y=11
WriteLine(point++); // x=12, y=12
WriteLine($"Префиксная форма декремента\n { --point} ");
WriteLine($"Выполнение оператора –\n { -point}");
WriteLine($"не изменило исходную точку\n { point}");
}
}
}

Слайд 12

Перегрузка
унарных операторов

Платформа Microsoft и С# (шарп) язык программирования.

Интересно отметить, что с C#

Перегрузка унарных операторов Платформа Microsoft и С# (шарп) язык программирования. Интересно отметить,
нет возможности выполнить отдельно перегрузку постфиксной и префиксной форм операторов инкремента и декремента. Поэтому
при вызове постфиксная и префиксная форма работают одинаково, как префиксная форма.

using static System.Console;
namespace SimpleProject
{
class Point
{
public int X { get; set; }
public int Y { get; set; }
//перегрузка инкремента
public static Point operator ++(Point s)
{
s.X++;
s.Y++;
return s;
}
//перегрузка декремента
public static Point operator --(Point s)
{
s.X--;
s.Y--;
return s;
}
//перегрузка оператора -
public static Point operator -(Point s)
{
return new Point { X = -s.X, Y = -s.Y };
}
public override string ToString()
{
return $"Point: X = {X}, Y = {Y}";
}
}

class Program
{
static void Main()
{
Point point = new Point { X = 10, Y = 10 };
WriteLine($"Исходная точка\n{point}");
WriteLine("Префиксная и постфиксная формы инкремента выполняются одинаково");
WriteLine(++point); // x=11, y=11
WriteLine(point++); // x=12, y=12
WriteLine($"Префиксная форма декремента\n { --point} ");
WriteLine($"Выполнение оператора –\n { -point}");
WriteLine($"не изменило исходную точку\n { point}");
}
}
}

Слайд 13

Перегрузка бинарных операторов

Платформа Microsoft и С# (шарп) язык программирования.

Как отмечалось ранее, перегруженные

Перегрузка бинарных операторов Платформа Microsoft и С# (шарп) язык программирования. Как отмечалось
операторы являются статическими методами, поэтому бинарные операторы должны получать два параметра. Для примера перегрузки бинарных операций освежим некоторые знания за 8 класс общеобразовательной школы — векторы.
Итак, вектор — направленный отрезок, имеющий начало и конец, то есть две точки. Для того чтобы получить координаты вектора необходимо из координат конечной точки вычесть соответствующие координаты начальной точки. Для того чтобы сложить два вектора нужно сложить их соответствующие координаты, разность — аналогично. Для того чтобы умножить вектор на число, необходимо каждую координату вектора умножить на это число. Создадим класс Vector, используя разработанный ранее класс Point.

using static System.Console;
namespace SimpleProject
{
class Point
{
public int X { get; set; }
public int Y { get; set; }
}
class Vector
{
public int X { get; set; }
public int Y { get; set; }
public Vector() { }
public Vector(Point begin, Point end)
{
X = end.X - begin.X;
Y = end.Y - begin.Y;
}
public static Vector operator +(Vector v1,
Vector v2)
{
return new Vector
{
X = v1.X + v2.X,
Y = v1.Y + v2.Y
};
}
public static Vector operator -(Vector v1,
Vector v2)
{
return new Vector
{
X = v1.X - v2.X,
Y = v1.Y - v2.Y
};
}
public static Vector operator *(Vector v, int n)
{
v.X *= n;
v.Y *= n;
return v;
}

Слайд 14

Перегрузка бинарных операторов

Платформа Microsoft и С# (шарп) язык программирования.

Перегрузка операторов +=, *=,

Перегрузка бинарных операторов Платформа Microsoft и С# (шарп) язык программирования. Перегрузка операторов
-= выполняется автоматически после перегрузки соответствующих бинарных операторов, поэтому применение операции *= в коде ошибки не вызовет, а будет использован перегруженный оператор *.
Однако, перегруженные в примере, операторы будут использоваться компилятором, только если переменная типа Vector находится слева от знака операнда. То есть выражение v1*10 откомпилируется нормально, а при перестановке сомножителей — в выражении 10*v1 произойдет ошибка на этапе компиляции. Для исправления этой ошибки следует перегрузить оператор * с другим порядком операндов:

public override string ToString()
{
return $"Vector: X = {X}, Y = {Y}";
}
}
class Program
{
static void Main()
{
Point p1 = new Point { X = 2, Y = 3 };
Point p2 = new Point { X = 3, Y = 1 };
Vector v1 = new Vector(p1, p2);
Vector v2 = new Vector { X = 2, Y = 3 };
WriteLine($"\tВектора\n{v1}\n{v2}");
WriteLine($"\n\tСложение векторов\n{v1 + v2}\n"); // x=3, y=1
WriteLine($"\tРазность векторов\n{v1 - v2}\n"); // x=-1, y=-5
WriteLine("Введите целое число");
int n = int.Parse(ReadLine());
v1 *= n;
WriteLine($"\n\tУмножение вектора на число { n}\n{v1}\n ");
}
}
}

public static Vector operator *(Vector v, int n)
{
return v * n;
}

Слайд 15

Перегрузка операторов отношений

Платформа Microsoft и С# (шарп) язык программирования.

Операции сравнения перегружаются парами:

Перегрузка операторов отношений Платформа Microsoft и С# (шарп) язык программирования. Операции сравнения
если перегружается операция ==, также должна перегружаться операция !=. Существуют следующие пары операторов сравнения:
■ == и !=
■ < и >
■ <= и >=.
При перегрузке операторов отношения надо учитывать, что есть два способа проверки равенства:
■ равенство ссылок (тождество);
■ равенство значений.
В классе Object определены следующие методы сравнения объектов:
■ public static bool ReferenceEquals(Object obj1, Object obj2)
■ public bool virtual Equals(Object obj)
Есть отличия в работе этих методов со значимыми и ссылочными типами.

Слайд 16

Перегрузка операторов отношений

Платформа Microsoft и С# (шарп) язык программирования.

Метод ReferenceEquals() проверяет, указывают

Перегрузка операторов отношений Платформа Microsoft и С# (шарп) язык программирования. Метод ReferenceEquals()
ли две ссылки на один и тот же экземпляр класса; точнее — содержат ли две ссылки одинаковый адрес памяти. Этот метод невозможно переопределить. Со значимыми типами ReferenceEquals() всегда возвращает false, т.к. при сравнении выполняется приведение к Object и упаковка, упакованные объекты располагаются по разным адресам. Метод Equals() является виртуальным. Его реализация в Object выполняет проверку равенства ссылок, т.е. работает, так же как и ReferenceEquals(). Для значимых типов в базовом типе System.ValueType выполнено переопределение метода Equals(), в котором выполняется сравнение объектов путем сравнения всех полей (побитовое сравнение). Пример использования методов ReferenceEquals() и Equals() со ссылочными и значимыми типами:

using static System.Console;
namespace SimpleProject
{
class CPoint
{
public int X { get; set; }
public int Y { get; set; }
}
struct SPoint
{
public int X { get; set; }
public int Y { get; set; }
}
class Program
{
static void Main()
{
// работа метода ReferenceEquals со
// ссылочными и значимыми типами
//ссылочный тип
CPoint cp = new CPoint { X = 10, Y = 10 };
CPoint cp1 = new CPoint { X = 10, Y = 10 };
CPoint cp2 = cp1;
// хотя p и p1 содержат одинаковые
// значения, они указывают на разные
// адреса памяти
WriteLine($"ReferenceEquals(cp, cp1) = { ReferenceEquals(cp, cp1)} "); // false

Слайд 17

Перегрузка операторов отношений

Платформа Microsoft и С# (шарп) язык программирования.

Перегрузка оператора == обычно

Перегрузка операторов отношений Платформа Microsoft и С# (шарп) язык программирования. Перегрузка оператора
выполняется путем вызова метода Equals(), поэтому необходимо переопределить метод Equals() в собственном типе. Поскольку в System.ValueType метод Equals() выполняет побитовое сравнение, то в собственных значимых типах его можно и не переопределять. Однако, в System.ValueType получение значений полей для сравнения в методе Equals() выполняется с помощью рефлексии, что приводит к снижению производительности. Поэтому при разработке значимого типа для увеличения быстродействия все-таки рекомендуется выполнить переопределение метода Equals().

// p1 и p2 указывают на один и тот же
// адрес памяти
WriteLine($"ReferenceEquals(cp1, cp2) = { ReferenceEquals(cp1, cp2)} "); // true
// значимый тип
SPoint sp = new SPoint { X = 10, Y = 10 };
// при передаче в метод ReferenceEquals
// выполняется упаковка, упакованные
// объекты располагаются
// по разным адресам
WriteLine($"ReferenceEquals(sp, sp) = { ReferenceEquals(sp, sp)} "); // false
// работа метода Equals со ссылочными
// и значимыми типами
// выполняется сравнение адресов
// ссылочных типов
WriteLine($"Equals(cp, cp1) = { Equals(cp, cp1)} "); // false
// значимый тип
SPoint sp1 = new SPoint { X = 10, Y = 10 };
// выполняется сравнение значений полей
WriteLine($"Equals(sp, sp1) = { Equals(sp, sp1)} "); // true
}
}
}

Слайд 18

Перегрузка операторов отношений

Платформа Microsoft и С# (шарп) язык программирования.

При переопределении метода Equals()

Перегрузка операторов отношений Платформа Microsoft и С# (шарп) язык программирования. При переопределении
следует также переопределять и метод GetHashCode(). Этот метод предназначен для получения целочисленного значения хеш-кода объекта, при этом различным объектам должны соответствовать различные хеш–коды. Если перегрузку метода GetHashCode() не выполнить, то компилятор выдаст предупреждение. При перегрузке оператора != мы воспользовались оператором логического отрицания (!) и перегруженным оператором ==. в качестве сравнения двух точек при перегрузке операторов <и> было взято расстояние между заданной точкой и точкой с координатами (0, 0), которое вычисляется с использованием теоремы Пифагора. Пример перегрузки операторов отношений для класса Point:

using System;
using static System.Console;
namespace SimpleProject
{
class Point
{
public int X { get; set; }
public int Y { get; set; }
// переопределение метода Equals
public override bool Equals(object obj)
{
return this.ToString() == obj.ToString();
}
// необходимо также переопределить метод
// GetHashCode
public override int GetHashCode()
{
return this.ToString().GetHashCode();
}
public static bool operator ==(Point p1, Point p2)
{
return p1.Equals(p2);
}
public static bool operator !=(Point p1, Point p2)
{
return !(p1 == p2);
}
public static bool operator >(Point p1, Point p2)
{
return Math.Sqrt(p1.X * p1.X + p1.Y * p1.Y) >
Math.Sqrt(p2.X * p2.X + p2.Y * p2.Y);
}
public static bool operator <(Point p1, Point p2)
{
return Math.Sqrt(p1.X * p1.X + p1.Y * p1.Y) <
Math.Sqrt(p2.X * p2.X + p2.Y * p2.Y);
}

Слайд 19

Перегрузка операторов отношений

Платформа Microsoft и С# (шарп) язык программирования.

.

public override string ToString()

Перегрузка операторов отношений Платформа Microsoft и С# (шарп) язык программирования. . public
{
return $"Point: X = {X}, Y = {Y}.";
}
}
class Program
{
static void Main(string[] args)
{
Point point1 = new Point { X = 10, Y = 10 };
Point point2 = new Point { X = 20, Y = 20 };
WriteLine($"point1: {point1}");
WriteLine($"point2: {point2}\n");
WriteLine($"point1 == point2: { point1 == point2} "); // false
WriteLine($"point1 != point2: {point1 != point2}\n"); // true
WriteLine($"point1 > point2: {point1 > point2}"); // false
WriteLine($"point1 < point2: {point1 < point2}"); // true
}
}
}

Слайд 20

Перегрузка операторов true и false

Платформа Microsoft и С# (шарп) язык программирования.

При перегрузке

Перегрузка операторов true и false Платформа Microsoft и С# (шарп) язык программирования.
операторов true и false разработчик задает критерий истинности для своего типа данных. После этого, объекты типа напрямую можно использовать в структуре операторов if, do, while, for в качестве условных выражений.
Перегрузка выполняется по следующим правилам:
■ оператор true должен возвращать значение true, если состояние объекта истинно и false в противном случае;
■ оператор false должен возвращать значение true, если состояние объекта ложно и false в противном случае;
■ операторы true и false надо перегружать в паре.
В качестве критерия истинности мы взяли равенство всех координат конкретной точки нулевому значению.

using static System.Console;
namespace SimpleProject
{
class Point
{
public int X { get; set; }
public int Y { get; set; }
public static bool operator true(Point p)
{
return p.X != 0 || p.Y != 0 ? true : false;
}
public static bool operator false(Point p)
{
return p.X == 0 && p.Y == 0 ? true : false;
}
public override string ToString()
{
return $"Point: X = {X}, Y = {Y}.";
}
}
class Program
{
static void Main(string[] args)
{
WriteLine("Введите координаты точки на плоскости");
Point point = new Point
{
X = int.Parse(ReadLine()),
Y = int.Parse(ReadLine())
};
if (point)
{
WriteLine("Точка не в начале координат.");
}
else
{
WriteLine("Точка в начале координат.");
}
}
}
}

Слайд 21

Перегрузка
логических операторов

Платформа Microsoft и С# (шарп) язык программирования.

Логические операторы && и ||

Перегрузка логических операторов Платформа Microsoft и С# (шарп) язык программирования. Логические операторы
перегрузить нельзя, но они моделируются с помощью операторов & и |, допускающих перегрузку. Для того чтобы это стало возможным, необходимо
выполнить ряд требований:
■ в классе должна быть выполнена перегрузка операторов true и false;
■ в классе необходимо перегрузить логические операторы & и |;
■ методы перегрузки операторов & и | должны возвращать тип класса, в котором осуществляется перегрузка;
■ параметрами в методах перегрузки операторов & и | должны быть ссылки на класс, который содержит перегрузку.

using static System.Console;
namespace SimpleProject
{
class Point
{
public int X { get; set; }
public int Y { get; set; }
public static bool operator true(Point p)
{
return p.X != 0 || p.Y != 0 ? true : false;
}
public static bool operator false(Point p)
{
return p.X == 0 && p.Y == 0 ? true : false;
}
// перегружаем логический оператор |
public static Point operator |(Point p1,
Point p2)
{
if ((p1.X != 0 || p1.Y != 0) || (p2.X !=
0 || p2.Y != 0))
return p2;
return new Point();
}
// перегружаем логический оператор &
public static Point operator &(Point p1,
Point p2)
{
if ((p1.X != 0 && p1.Y != 0) && (p2.X !=
0 && p2.Y != 0))
return p2;
return new Point();
}
public override string ToString()
{
return $"Point: X = {X}, Y = {Y}.";
}
}

class Program
{
static void Main(string[] args)
{
Point point1 = new Point { X = 10, Y = 10 };
Point point2 = new Point { X = 0, Y = 0 };
WriteLine($"point1: {point1}");
WriteLine($"point2: {point2}\n");
Write("point1 && point2: ");
if (point1 && point2)
{
WriteLine("true");
}
else
{
WriteLine("false");
}
Write("point1 || point2: ");
if (point1 || point2)
{
WriteLine("true");
}
else
{
WriteLine("false");
}
}
}
}

https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/operators/boolean-logical-operators

Слайд 22

Перегрузка
логических
операторов

Платформа Microsoft и С# (шарп) язык программирования.

Выполнение операторов && и ||

Перегрузка логических операторов Платформа Microsoft и С# (шарп) язык программирования. Выполнение операторов
происходит следующим образом. Для оператора && первый операнд проверяется с использованием перегруженного оператора false, если результат равен false, тогда дальнейшее сравнение операндов осуществляется с использованием перегруженного оператора &, результат этого сравнения проверяется вызовом перегруженного оператора true, так как используется условный оператор. Если результат оператора false для первого операнда будет равен true, тогда оператор & выполняться не будет, а параметром для оператора true будет являться первый операнд. Для оператора || первый операнд проверяется с использованием перегруженного оператора true, если результат равен false, тогда дальнейшее сравнение операндов осуществляется с использованием перегруженного оператора |, результат этого сравнения также проверяется вызовом перегруженного оператора true (условный оператор). Если результат оператора true для первого операнда будет равен true, тогда оператор | выполняться не будет, а параметром для оператора true будет являться первый операнд.

Слайд 23

Перегрузка операторов преобразования

Платформа Microsoft и С# (шарп) язык программирования.

В собственных типах можно

Перегрузка операторов преобразования Платформа Microsoft и С# (шарп) язык программирования. В собственных
определить операторы, которые будут использоваться для выполнения приведения. Приведение может быть двух типов:
■ из произвольного типа в собственный тип;
■ из собственного типа в произвольный тип.
Для ссылочных и значимых типов приведение выполняется одинаково.
Как Вам известно, приведение может выполняться явным и неявным образом. Явное приведение типов требуется, если возможна потеря данных в результате приведения. Например:
■ при преобразовании int в short, потому что размер short недостаточен для сохранения значения int;
■ при преобразовании типов данных со знаком в без знаковые может быть получен неверный результат, если переменная со знаком содержит отрицательное значение;
■ при конвертировании типов с плавающей точкой в целые, так как дробная часть теряется;
■ при конвертировании типа, допускающего null значения, в тип, не допускающий null, если исходная переменная содержит null, генерируется исключение.

Слайд 24

Перегрузка операторов преобразования

Платформа Microsoft и С# (шарп) язык программирования.

Если потери данных в

Перегрузка операторов преобразования Платформа Microsoft и С# (шарп) язык программирования. Если потери
результате приведения не происходит, приведение можно выполнять как неявное. Операция приведения должна быть помечена либо как implicit, либо как explicit, чтобы указать, как ее предполагается использовать:
■ implicit задает неявное преобразование, его можно использовать, если преобразование всегда безопасно независимо от значения переменной, которая преобразуется;
■ explicit задает явное преобразование, его следует использовать, если возможна потеря данных или возникновение исключения.
Объявление оператора преобразования в классе:
Имеется возможность выполнять приведение между экземплярами разных собственных структур или классов. Однако при этом существуют следующие ограничения:
■ нельзя определить приведение между классами, если один из них является наследником другого;
■ приведение может быть определено только в одном из типов: либо в исходном типе, либо в типе назначения.

Слайд 25

Перегрузка операторов преобразования

Платформа Microsoft и С# (шарп) язык программирования.

Например, имеется следующая иерархия

Перегрузка операторов преобразования Платформа Microsoft и С# (шарп) язык программирования. Например, имеется
классов. Единственное допустимое приведение типов — это приведения между классами Square и Rectangle, потому что эти классы не наследуют друг друга. При этом следует помнить, что если оператор преобразования определен внутри одного класса, то нельзя определить такой же оператор внутри другого класса. Приведем пример использования операторов преобразования, взяв за основу иерархию классов на рисунке. Перегрузим, оператор неявного преобразования (implicit), из класса Square в класс Rectangle без потери данных — ширину и высоту прямоугольника получаем на
основании стороны квадрата. Также перегрузим, оператор явного преобразования (explicit), из класса Rectangle в класс Square с потерей данных — сторона квадрата равна высоте прямоугольника, ширина не учитывается. Для класса Square определим явное и неявное преобразование к целому типу.

Слайд 26

Перегрузка операторов преобразования

Платформа Microsoft и С# (шарп) язык программирования.

using static System.Console;
namespace SimpleProject
{

Перегрузка операторов преобразования Платформа Microsoft и С# (шарп) язык программирования. using static
abstract class Figure
{
public abstract void Draw();
}
abstract class Quadrangle : Figure { }
class Rectangle : Quadrangle
{
public int Width { get; set; }
public int Height { get; set; }
public static implicit operator Rectangle(Square s)
{
return new Rectangle
{
Width = s.Length * 2,
Height = s.Length
};
}
public override void Draw()
{
for (int i = 0; i < Height; i++, WriteLine())
{
for (int j = 0; j < Width; j++)
{
Write("*");
}
}
WriteLine();
}
public override string ToString()
{
return $"Rectangle: Width = {Width}, Height = { Height}";
}
}

class Square : Quadrangle
{
public int Length { get; set; }
public static explicit operator
Square(Rectangle rect)
{
return new Square { Length = rect.Height };
}
public static explicit operator int(Square s)
{
return s.Length;
}
public static implicit operator Square(int number)
{
return new Square { Length = number };
}
public override void Draw()
{
for (int i = 0; i < Length; i++, WriteLine())
{
for (int j = 0; j < Length; j++)
{
Write("*");
}
}
WriteLine();
}
public override string ToString()
{
return $"Square: Length = {Length}";
}
}

class Program
{
static void Main(string[] args)
{
Rectangle rectangle = new Rectangle
{
Width = 5,
Height = 10
};
Square square = new Square { Length = 7 };
Rectangle rectSquare = square;
WriteLine($"Неявное преобразование квадрата({ square}) кпрямоугольнику.\n{ rectSquare}\n");
rectSquare.Draw();
Square squareRect = (Square)rectangle;
WriteLine($"Явное преобразование прямоугольника({ rectangle}) к квадрату.\n{ squareRect}\n");
squareRect.Draw();
WriteLine("Введите целое число.");
int number = int.Parse(ReadLine());
Square squareInt = number;
WriteLine($"Неявное преобразование целого ({ number}) к квадрату.\n{ squareInt}\n");
squareInt.Draw();
number = (int)square;
WriteLine($"Явное преобразование квадрата ({ square}) к целому.\n { number} ");
}
}
}

Слайд 27

Перегрузка операторов преобразования

Платформа Microsoft и С# (шарп) язык программирования.

Результат выполнения программы!

Перегрузка операторов преобразования Платформа Microsoft и С# (шарп) язык программирования. Результат выполнения программы!

Слайд 28

Индексаторы

Платформа Microsoft и С# (шарп) язык программирования.

А теперь ещё одно любопытное средство

Индексаторы Платформа Microsoft и С# (шарп) язык программирования. А теперь ещё одно
языка C#,представляющее собой одновременно способ перегрузки оператора [] (но без участия ключевого слова operator) и разновидность свойства (или как его ещё называют, свойством с параметрами). Индексаторы применяются для облегчения работы со специальными классами, реализующими пользовательскую коллекцию, используя синтаксис индексирования массива. Объявление индексатора подобно свойству, но с той разницей, что индексаторы безымянные (вместо имени используется ссылка this) и что индексаторы включают параметры индексирования.
Синтаксис объявления индексатора следующий:
Тип_данных — это тип объектов коллекции, this — это ссылка на объект, в котором определен индексатор. То, что для индексаторов используется синтаксис со ссылкой this, подчёркивает, что их можно использовать только на экземплярном уровне и никак иначе. Тип_аргумента представляет индекс объекта в коллекции, причём этот индекс необязательно целочисленный, он может быть любого типа. У каждого индексатора должен быть минимум один параметр, но их может быть и больше (многомерные индексаторы).

Слайд 29

Индексаторы

Платформа Microsoft и С# (шарп) язык программирования.

Рассмотрим пример создания и применения индексатора.

Индексаторы Платформа Microsoft и С# (шарп) язык программирования. Рассмотрим пример создания и
Предположим, есть некий магазин (класс Shop), занимающийся реализацией ноутбуков (класс Laptop). Дабы не перегружать пример лишней информацией, снабдим класс Laptop только двумя свойствами: Vendor — имя фирмы-производителя и Price — цена ноутбука. Также переопределим метод ToString() для отображения информации по конкретной единице товара. в качестве единственного поля класса Shop выступает ссылка на массив объектов Laptop. в конструкторе с одним параметром задаётся количество элементов массива и выделяется память для их хранения. Далее нам нужно сделать возможным обращение к элементам этого массива через экземпляр класса Shop, пользуясь синтаксисом массива так, словно класс Shop и есть массив элементов типа Laptop. Для этого мы добавляем в класс Shop индексатор.

Создание одномерных индексаторов

Слайд 30

Индексаторы

Платформа Microsoft и С# (шарп) язык программирования.

Здесь в аксессоре get осуществляется проверка

Индексаторы Платформа Microsoft и С# (шарп) язык программирования. Здесь в аксессоре get
нахождения индекса в пределах массива и в случае если в индексатор попробуют передать индекс, который находится за пределами массива, тогда будет cгенерирована исключительная ситуация IndexOutOfRangeException. Еще одна особенность данной программы — свойство Length в классе Shop, добавление которого позволяет получать размер массива laptopArr класса Shop подобно свойству Length стандартного массива.

Создание одномерных индексаторов

Слайд 31

Индексаторы

Платформа Microsoft и С# (шарп) язык программирования.

.

Создание одномерных индексаторов

using System;
using static System.Console;
namespace

Индексаторы Платформа Microsoft и С# (шарп) язык программирования. . Создание одномерных индексаторов
SimpleProject
{
public class Laptop
{
public string Vendor { get; set; }
public double Price { get; set; }
public override string ToString()
{
return $"{Vendor} {Price}";
}
}
public class Shop
{
Laptop[] laptopArr;
public Shop(int size)
{
laptopArr = new Laptop[size];
}
public int Length
{
get { return laptopArr.Length; }
}
public Laptop this[int index]
{
get
{
if (index >= 0 && index <
laptopArr.Length)
{
return laptopArr[index];
}
throw new IndexOutOfRangeException();
}
set
{
laptopArr[index] = value;
}
}
}

public class Program
{
public static void Main()
{
Shop laptops = new Shop(3);
laptops[0] = new Laptop
{
Vendor = "Samsung",
Price = 5200
};
laptops[1] = new Laptop
{
Vendor = "Asus",
Price = 4700
};
laptops[2] = new Laptop
{
Vendor = "LG",
Price = 4300
};
try
{
for (int i = 0; i < laptops.Length; i++)
{
WriteLine(laptops[i]);
}
}
catch (Exception ex)
{
WriteLine(ex.Message);
}
}
}
}

Теперь рассмотрим
код программы целиком.

Слайд 32

Индексаторы

Платформа Microsoft и С# (шарп) язык программирования.

В C# есть возможность создавать не

Индексаторы Платформа Microsoft и С# (шарп) язык программирования. В C# есть возможность
только одномерные, но и многомерные индексаторы. Это возможно, если класс-контейнер содержит в качестве поля массив с более чем одним измерением. Для демонстрации такой возможности приведём схематичный пример использования двумерного индексатора, не перегруженный дополнительными проверками.

Создание многомерных индексаторов

using static System.Console;
namespace SimpleProject
{
public class MultArray
{
private int[,] array;
public int Rows { get; private set; }
public int Cols { get; private set; }
public MultArray(int rows, int cols)
{
Rows = rows;
Cols = cols;
array = new int[rows, cols];
}
public int this[int r, int c]
{
get { return array[r, c]; }
set { array[r, c] = value; }
}
}

public class Program
{
static void Main()
{
MultArray multArray = new MultArray(2, 3);
for (int i = 0; i < multArray.Rows; i++)
{
for (int j = 0; j < multArray.Cols; j++)
{
multArray[i, j] = i + j;
Write($"{multArray[i, j]} ");
}
WriteLine();
}
}
}
}

Слайд 33

Индексаторы

Платформа Microsoft и С# (шарп) язык программирования.

Как было отмечено ранее, тип может

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

Перегрузка индексаторов

Слайд 34

Индексаторы

Платформа Microsoft и С# (шарп) язык программирования.

Перегрузка индексаторов

using System;
using static System.Console;
namespace SimpleProject
{

Индексаторы Платформа Microsoft и С# (шарп) язык программирования. Перегрузка индексаторов using System;
public class Laptop
{
public string Vendor { get; set; }
public double Price { get; set; }
public override string ToString()
{
return $"{Vendor} {Price}";
}
}
enum Vendors { Samsung, Asus, LG };
public class Shop
{
private Laptop[] laptopArr;
public Shop(int size)
{
laptopArr = new Laptop[size];
}
public int Length
{
get { return laptopArr.Length; }
}
public Laptop this[int index]
{
get
{
if (index >= 0 && index <
laptopArr.Length)
{
return laptopArr[index];
}
throw new IndexOutOfRangeException();
}
set
{
laptopArr[index] = value;
}
}

public class Program
{
public static void Main()
{
Shop laptops = new Shop(3);
laptops[0] = new Laptop
{
Vendor = "Samsung",
Price = 5200
};
laptops[1] = new Laptop
{
Vendor = "Asus",
Price = 4700
};
laptops[2] = new Laptop
{
Vendor = "LG",
Price = 4300
};
try
{
for (int i = 0; i < laptops.Length; i++)
{
WriteLine(laptops[i]);
}
WriteLine();
WriteLine($"Производитель Asus: { laptops["Asus"]}.");
WriteLine($"Производитель HP: { laptops["HP"]}.");
// игнорирование
laptops["HP"] = new Laptop();
WriteLine($"Стоимость 4300: { laptops[4300.0]}.");
// недопустимая стоимость
WriteLine($"Стоимость 10500: { laptops[10500.0]}.");
// игнорирование
laptops[10500.0] = new Laptop();
}
catch (Exception ex)
{
WriteLine(ex.Message);
}
}
}
}

public Laptop this[string name]
{
get
{
if (Enum.IsDefined(typeof(Vendors), name))
{
return laptopArr[(int)Enum.
Parse(typeof(Vendors), name)];
}
else
{
return new Laptop();
}
}
set
{
if (Enum.IsDefined(typeof(Vendors), name))
{
laptopArr[(int)Enum.
Parse(typeof(Vendors), name)] =
value;
}
}
}
public int FindByPrice(double price)
{
for (int i = 0; i < laptopArr.Length; i++)
{
if (laptopArr[i].Price == price)
{
return i;
}
}
return -1;
}
public Laptop this[double price]
{
get
{
if (FindByPrice(price) >= 0)
{
return this[FindByPrice(price)];
}
throw new Exception("Недопустимая стоимость.");
}
set
{
if (FindByPrice(price) >= 0)
{
this[FindByPrice(price)] = value;
}
}
}
}

Слайд 35

Домашняя работа

Платформа Microsoft и С# (шарп) язык программирования.

Домашняя работа Платформа Microsoft и С# (шарп) язык программирования.

Слайд 36

Лабораторная работа

Платформа Microsoft и С# (шарп) язык программирования.

Лабораторная работа Платформа Microsoft и С# (шарп) язык программирования.

Слайд 37

Платформа Microsoft и С# (шарп) язык программирования.

Повторение предыдущих тем!

Платформа Microsoft и С# (шарп) язык программирования. Повторение предыдущих тем!

Слайд 38

Платформа Microsoft и С# (шарп) язык программирования.

Модификаторы доступа в C#

В C# применяются

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

Слайд 39

Платформа Microsoft и С# (шарп) язык программирования.

Абстрактные классы и члены классов

Кроме обычных

Платформа Microsoft и С# (шарп) язык программирования. Абстрактные классы и члены классов
свойств и методов абстрактный класс может иметь абстрактные члены классов, которые определяются с помощью ключевого слова abstract и не имеют никакого функционала. В частности, абстрактными могут быть: Методы, Свойства, Индексаторы, События.
Абстрактные члены классов не должны иметь модификатор private. При этом производный класс обязан переопределить и реализовать все абстрактные методы и свойства, которые имеются в базовом абстрактном классе. При переопределении в производном классе такой метод или свойство также объявляются с модификатором override (как и при обычном переопределении виртуальных методов и свойств). Также следует учесть, что если класс имеет хотя бы одиный абстрактный метод (или абстрактные свойство, индексатор, событие), то этот класс должен быть определен как абстрактный.

Слайд 40

Платформа Microsoft и С# (шарп) язык программирования.

Статические члены и модификатор static

Кроме обычных

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