Skip to content

Commit dd7b1d0

Browse files
committed
Lesson 10
1 parent dcf88f1 commit dd7b1d0

File tree

3 files changed

+120
-0
lines changed

3 files changed

+120
-0
lines changed

CSharpCourse.sln

+6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lesson_008", "Lesson_008\Le
2323
EndProject
2424
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lesson_009", "Lesson_009\Lesson_009.csproj", "{CF774FEC-B00B-4E3D-8CF4-98F0CCB03DC9}"
2525
EndProject
26+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lesson_010", "Lesson_010\Lesson_010.csproj", "{BA985226-493F-46B2-BA61-5D1841FB4CBC}"
27+
EndProject
2628
Global
2729
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2830
Debug|Any CPU = Debug|Any CPU
@@ -69,6 +71,10 @@ Global
6971
{CF774FEC-B00B-4E3D-8CF4-98F0CCB03DC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
7072
{CF774FEC-B00B-4E3D-8CF4-98F0CCB03DC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
7173
{CF774FEC-B00B-4E3D-8CF4-98F0CCB03DC9}.Release|Any CPU.Build.0 = Release|Any CPU
74+
{BA985226-493F-46B2-BA61-5D1841FB4CBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
75+
{BA985226-493F-46B2-BA61-5D1841FB4CBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
76+
{BA985226-493F-46B2-BA61-5D1841FB4CBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
77+
{BA985226-493F-46B2-BA61-5D1841FB4CBC}.Release|Any CPU.Build.0 = Release|Any CPU
7278
EndGlobalSection
7379
GlobalSection(SolutionProperties) = preSolution
7480
HideSolutionNode = FALSE

Lesson_010/Lesson_010.csproj

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net8.0</TargetFramework>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
</PropertyGroup>
8+
9+
10+
</Project>

Lesson_010/Program.cs

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
Console.WriteLine("-----------------Implicit and explicit type casting-----------------");
2+
3+
short s = 300;
4+
int i = s; // Неявное приведение к типу "int" (расширяющее преобразование безопасно, поэтому происходит неявно)
5+
6+
byte b = unchecked((byte)s); // Явное приведение к типу "byte" при сужающем преобразовании. Также явное указание игнорировать ошибки переполнения с помощью оператора "unchecked".
7+
Console.WriteLine(b); // 44 (так как произошло переполнение)
8+
9+
ushort us = 500;
10+
i = us; // Неявное приведение к типу "int" (расширяющее преобразование безопасно, поэтому происходит неявно)
11+
12+
us = (ushort)i; // Явное приведение к типу "ushort" при сужающем преобразовании.
13+
14+
float f = 100.8F;
15+
double d = f; // Неявное приведение к типу "double" (расширяющее преобразование безопасно, поэтому происходит неявно)
16+
f = (float)d; // Явное приведение к типу "float" при сужающем преобразовании.
17+
18+
decimal dec = (decimal)f; // Приведение "float" и "double" к "decimal" всегда требует явного преобразования
19+
20+
dec = us; // Целочисленные типы приводятся к "decimal" неявно
21+
22+
f = i; // Преобразование целочисленных типов к типам IEEE 754 cчитается расширяющим и происходит неявно (см. нюанс в ответах на домашнее задание)
23+
24+
i = (int)f; // Явное приведение к типу "int" при сужающем преобразовании (дробная часть просто отбрасывается).
25+
26+
byte carSpeed = 60;
27+
byte bikeSpeed = (byte)(carSpeed + 40); // Необходимо явное приведение, так как при арифметических операциях с целыми числами операнды подтягиваются до "int" или "long", если не хватает "int"
28+
29+
carSpeed = (byte)(carSpeed - 20); // Необходимо явное приведение даже при присваивании той же переменной
30+
carSpeed -= 20; // При составном присваивании явное приведение не требуется
31+
32+
uint strLength = (uint)"str".Length; // Необходимо явное приведение, так как свойство "Length" имеет тип "int"
33+
int strLen = "str".Length; // Явное приведение не требуется, так как типы совпадают
34+
35+
36+
Console.WriteLine("\n-----------------Overflow-----------------");
37+
38+
// Двоичное представление чисел
39+
// 0000 0001 0010 1100 - 300 в short
40+
// 0010 1100 - 44 в byte
41+
42+
//byte notCompiled = 256; // Код не компилируется, так как компилятор сразу видит переполнение
43+
//byte notCompiled2 = 200 + 56; // Код не компилируется, так как компилятор сразу видит переполнение (компилятор умеет выполнять арифметические операции с литералами)
44+
45+
//const int constNum = 56;
46+
//byte notCompiled3 = 200 + constNum; // Код не компилируется, так как компилятор сразу видит переполнение (компилятор умеет выполнять арифметические операции с константами)
47+
48+
int num = 56;
49+
byte overflow1 = (byte)(200 + num); // Код компилируется и приводит к переполнению на этапе выполнения (компилятор не умеет выполнять арифметические операции с переменными)
50+
//byte overflow1 = checked((byte)(200 + num)); // Явная проверка переполнения с помощью оператора "checked" (произойдёт ошибка)
51+
52+
Console.WriteLine(overflow1); // 0 (так как произошло переполнение)
53+
54+
byte overflow2 = 255;
55+
overflow2++;
56+
57+
// Явная проверка переполнения с помощью блочного выражения "checked" (произойдёт ошибка)
58+
//checked
59+
//{
60+
// overflow2++;
61+
//}
62+
63+
Console.WriteLine(overflow2); // 0 (так как произошло переполнение)
64+
65+
66+
Console.WriteLine("\n-----------------No overflow for IEEE 754 floating types-----------------");
67+
68+
float infinity = float.MaxValue * 2;
69+
Console.WriteLine(infinity); // ∞
70+
71+
Console.WriteLine(5.0 / 0); // ∞
72+
Console.WriteLine(0.0 / 0); // NaN при делении на ноль чисел с плавающей точкой
73+
74+
//int zero = 0;
75+
//Console.WriteLine(5 / zero); // Ошибка "System.DivideByZeroException" при целочисленном делении на 0
76+
77+
78+
Console.WriteLine("\n-----------------Numeric types members-----------------");
79+
80+
Console.WriteLine(int.MinValue); // -2147483648
81+
Console.WriteLine(int.MaxValue); // 2147483647
82+
83+
Console.WriteLine(int.IsEvenInteger(10)); // True
84+
Console.WriteLine(int.Abs(-5)); // 5
85+
86+
Console.WriteLine(double.Pi); // 3,141592653589793
87+
Console.WriteLine(double.E); // 2,718281828459045
88+
Console.WriteLine(double.NegativeInfinity); // -∞
89+
90+
91+
Console.WriteLine("\n-----------------Parse numbers from strings-----------------");
92+
93+
int intNum = int.Parse("25"); // Парсинг целого числа из строки
94+
double doubleNum = double.Parse("5,8"); // Парсинг дробного числа из строки
95+
//int notNum = int.Parse("Hello!"); // Ошибка "System.FormatException" при парсинге числа, так как строка содержит не число
96+
97+
Console.Write("Enter a number: "); // Enter a number:
98+
string numberStr = Console.ReadLine(); // Считывание введённой в консоль строки и помещение её в переменную "numberStr"
99+
Console.WriteLine(numberStr); // Вывод считанной строки в консоль
100+
101+
//int number = int.Parse(numberStr); // Парсинг считанной строки в число
102+
int number = Convert.ToInt32(numberStr); // Аналог строки выше, но с помощью класса "Convert". За кулисами всё равно используется "int.Parse".
103+
int doubled = number * 2; // Умножение числа на 2
104+
bool isPositive = int.IsPositive(number); // Проверка, является ли число положительным

0 commit comments

Comments
 (0)