Преобразование и сравнение типов
Преобразование и сравнение типов
Преобразование строки
Преобразование строки
Преобразование строки
Преобразование строки
Преобразование строки
Преобразование строки
Преобразование строки
Преобразование строки
Преобразование и сравнение типов
Преобразование в строку
Преобразование в строку
Преобразование пользовательского типа в строку
Преобразование пользовательского типа в строку
Cравнение типов
Сравнение на равенство
Сравнение на равенство
Настройка сравнения на равенство
Релизация интерфейса IEquatable<T>
Cравнение типов
Cравнение типов
Cравнение типов
Cравнение типов
Cравнение типов
Преобразование типов
Преобразование типов
Преобразование типов
Преобразование типов
Преобразование типов
Преобразование типов
Преобразование типов
Преобразование типов
2.13M
Category: programmingprogramming

ЛК_ХХ_Преобразование и сравнение типов_(2) (1)

1. Преобразование и сравнение типов

1

2. Преобразование и сравнение типов

ПРЕОБРАЗОВАНИЕ ИЗ СТРОКИ
2

3. Преобразование строки

Все примитивные типы имеют два метода, которые
позволяют преобразовать строку к данному типу. Это
методы Parse()и TryParse().

4. Преобразование строки

Метод Parse() в качестве параметра принимает строку и
возвращает объект текущего типа.
int a = int.Parse("10");
double b = double.Parse("23,56");
decimal c = decimal.Parse("12,45");
byte d = byte.Parse("4");
Console.WriteLine($"a={a} b={b} c={c}
d={d}");

5. Преобразование строки

Парсинг дробных чисел зависит от настроек текущей
локали (23,56 или 23.56).
Чтобы не зависеть от культурных различий мы можем
установить
четкий
формат
с
помощью
класса
NumberFormatInfo
и
его
свойства
NumberDecimalSeparator

6. Преобразование строки

IFormatProvider formatter =
new NumberFormatInfo{NumberDecimalSeparator = "."};
double b = double.Parse("23.56", formatter);

7. Преобразование строки

Метод TryParse() пытается преобразовать строку к
типу и, если преобразование прошло успешно, то
возвращает true.

8. Преобразование строки

int parsedString;
Console.WriteLine("Введите строку:");
string input = Console.ReadLine();
bool result = int.TryParse(input, out parsedString);
if (result == true)
Console.WriteLine(parsedString);
else
Console.WriteLine($"невозможно
преобразовать
\"{input}\" в int");

9. Преобразование строки

Класс Convert представляет еще один способ для
преобразования значений. Для этого в нем определены
следующие статические методы:
ToBoolean(value)
ToByte(value)
ToChar(value)
ToDateTime(value)
ToDecimal(value)
ToDouble(value)
ToInt16(value)
ToInt32(value)
ToInt64(value)
ToSByte(value)
ToSingle(value)
ToUInt16(value)
ToUInt32(value)
ToUInt64(value)

10. Преобразование строки

int n = Convert.ToInt32("23");
bool b = true;
double d = Convert.ToDouble(b);

11. Преобразование и сравнение типов

ПРЕОБРАЗОВАНИЕ В СТРОКУ
11

12. Преобразование в строку

Все типы обладают методом ToString() (определен в
базовом классе Object)
Метод ToString() можно вызывать явно, но, если явный
вызов не указан, то он будет вызываться неявно, всякий
раз, когда требуется преобразование к строковому типу.
Console.WriteLine(24.5);
12

13. Преобразование в строку

public virtual string? ToString();
13

14. Преобразование пользовательского типа в строку

Car car = new();
Console.WriteLine(car.ToString());
14

15. Преобразование пользовательского типа в строку

class Car
{
public override string ToString()
{
. . .
}
}
15

16. Cравнение типов

СРАВНЕНИЕ НА РАВЕНСТВО
16

17. Сравнение на равенство

Оператор ==
По умолчанию неперегруженный оператор == проверяет:
Для ссылочных типов - равенство ссылок, определяя,
указывают ли две ссылки на один и тот же объект
Строка имеет перегруженный оператор ==, который
сравнивает не ссылки, а содержимое строк
Для предопределённых типов-значений проверяет равенство
этих значений
Для типа record сравниваются значения всех полей и
автоматически реализуемых свойств.
17

18. Сравнение на равенство

Метод Equals(object)
Если текущий экземпляр является ссылочным
типом, метод Equals(Object)
проверяет равенство
ссылок
Если
текущий
экземпляр
является
типом
значения, метод Equals(Object) проверяет равенство
значений (объекты должны быть одного типа).
18

19. Настройка сравнения на равенство

public virtual bool Equals (object? obj);
Можно переопределить Object.Equals (при этом
также
нужно
переопределить
метод
Object.GetHashCode)
19

20. Релизация интерфейса IEquatable<T>

Релизация интерфейса IEquatable<T>
class Car:IEquatable<Car>
{
public int Year { get; set; }
public override bool Equals(object obj)
{
return this.Equals(obj as Car);
}
public bool Equals(Car other)
{
if (other == null) return false;
return Year.Equals(other.Year);
}
public override int GetHashCode()
{
return Year.GetHashCode();
}
}
20

21. Cравнение типов

СРАВНЕНИЕ ДЛЯ ОПРЕДЕЛЕНИЯ ПОРЯДКА
21

22. Cравнение типов

Для
сортировки
интерфейс IComparable.
объектов
применяется
22

23. Cравнение типов

public interface IComparable<in T>
{
int CompareTo(T? other);
}
23

24. Cравнение типов

Результат сравнения:
<0 - текущий объект должен находиться перед объектом,
который передается в качестве параметра
=0 - оба объекта равны
>0 - текущий объект должен находиться после объекта,
передаваемого в качестве параметра
24

25. Cравнение типов

class Car:IEquatable<Car>, IComparable<Car>
{
public int Year { get; set; }
public int CompareTo(Car other)
{
if (other == null)
throw new Exception("Объекты нельзя сравнивать");
return Year.CompareTo(other.Year);
}
. . .
}
25

26. Преобразование типов

ПЕРЕГРУЗКА
БГУИР кафедра Информатики
И.И. ГЛАМАЗДИН
26

27. Преобразование типов

Если в переменную (параметр метода) одного типа нужно
записать значение другого типа, то для этого потребуется
механизм, который называется преобразованием типов.
БГУИР кафедра Информатики
И.И. ГЛАМАЗДИН
27

28. Преобразование типов

Неявные преобразования.
Специальный
синтаксис
не
требуется,
так
как
преобразование всегда завершается успешно и данные не
будут потеряны. Примеры включают преобразования из
меньших
в
большие
целочисленные
типы
и
преобразования из производных классов в базовые классы.
БГУИР кафедра Информатики
И.И. ГЛАМАЗДИН
28

29. Преобразование типов

Явные преобразования (приведения).
Для явных преобразований требуется выражение
приведения. Приведение требуется, если в ходе
преобразования данные могут быть утрачены или
преобразование может завершиться сбоем по другим
причинам. Типичными примерами являются числовое
преобразование в тип с меньшей точностью или меньшим
диапазоном и преобразование экземпляра базового класса
в производный класс.
БГУИР кафедра Информатики
И.И. ГЛАМАЗДИН
29

30. Преобразование типов

Для преобразований пользовательского типа в C#
предусмотрена специальная разновидность операторного
метода, называемая оператором преобразования.
Оператор преобразования преобразует объект исходного
класса в другой тип.
БГУИР кафедра Информатики
И.И. ГЛАМАЗДИН
30

31. Преобразование типов

Пользовательские преобразования не рассматриваются
операторами is и as.
БГУИР кафедра Информатики
И.И. ГЛАМАЗДИН
31

32. Преобразование типов

Для определения явного или неявного преобразования
используются
ключевые
слова operator и implicit или explicit соответственно.
Тип, который определяет преобразование, должен быть
типом
источника
или
целевого
объекта
этого
преобразования.
БГУИР кафедра Информатики
И.И. ГЛАМАЗДИН
32

33. Преобразование типов

public static implicit operator decimal(Account obj)
=>obj.Deposit;
public static explicit operator Account(decimal val)
=> new Account { Deposit=val};
БГУИР кафедра Информатики
И.И. ГЛАМАЗДИН
33

34.

var account = new Account { Deposit = 100 };
account.PrintInfo();
decimal d = account;
Console.WriteLine($"Получено число {d}") ;
account = (Account)500;
account.PrintInfo();
БГУИР кафедра Информатики
И.И. ГЛАМАЗДИН
34
English     Русский Rules