From 300f663b5004db2d98cf365adc1e654fcca8b189 Mon Sep 17 00:00:00 2001 From: StNicolay Date: Sun, 12 Nov 2023 09:00:57 +0000 Subject: [PATCH] C# 12.11.2023 --- C#/C#.md | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 109 insertions(+), 6 deletions(-) diff --git a/C#/C#.md b/C#/C#.md index c7b6e5b..3d288db 100644 --- a/C#/C#.md +++ b/C#/C#.md @@ -715,6 +715,11 @@ tom.Name = "Tom"; Person person = tom; Employee employee = (Employee)person; Employee? employee = person as Employee; // null если преобразовать не удалось +if (person is Employee employee) { + Console.WriteLine(employee.company); +} else { + Console.WriteLine("Преобразовать низя"); +} class Person { private string _name = ""; @@ -747,15 +752,113 @@ sealed class Employee: Person { > Возможность изменить функцианальность метода родительского класса в дочернем. *virtual* помечает метод для переопределения в базовом классе, а *override* используется в дочернем ```C# -class Foo { - public virtual void func() { - Console.WriteLine("Foo") +class Foo +{ + public virtual void func() + { + Console.WriteLine("Foo"); + } + + public virtual int Baz + { + get => 5; + set { Console.WriteLine(value); } } } -class Bar: Foo { - public override void func() { - Console.WriteLine("Bar") +class Bar : Foo +{ + public override sealed void func() // sealed запрещает дальнейшее переопределение + { + Console.WriteLine("Bar"); + } + + public override int Baz + { + get => 6; } } ``` + +## Shadowing / Hiding + +```C# +class Foo { + public const string class_ = "Foo"; + public int Baz { + get => 5; + } + public void Print() { + Console.WriteLine("Foo"); + } +} + +class Bar : Foo { + public new const string class_ = "Bar"; + public new int Baz { + get => 6; + } + public new void Print() { + Console.WriteLine("Bar"); + } +} +``` + +## Абстрактные классы + +> Для представления сущностей, не имеющих конкретного воплощения, предназначены абстрактные классы. От них нельзя создать объект. Абстрактный класс может содержать абстрактные методы и свойства, которые не могут быть private. Абстрактные методы не имеют тела. Все не абстрактные наследники должны определять все абстрактные методы и свойствая + +```C# +abstract class Transport +{ + public abstract void Move(); + + public abstract string Name + { + get; + set; + } +} + +class Car : Transport +{ + public override void Move() + { + Console.WriteLine("Car moves"); + } + + public override string Name { get; set; } = "Car"; +} +``` + +## Обобщения (generics) + +```C# +Person fooBar = new Person(10, "Foobar"); // или new(10, "Foobar") + +int x = 5; +int y = 10; +Swap(ref x, ref y) // или Swap(ref x, ref y) + +class Person +{ + public T Id { get; } + public string Name { get; } + + public Person(T id, string name) + { + Id = id; + Name = name; + } +} + +void Swap(ref T x, ref T y) { + T tmp = x; + x = y; + y = tmp; +} +``` + +## Оценка сложности + +> В программировании, вычислительную скорость алгоритмов обычно оценивают по количеству действий, который выполняет алгоритм, и по количеству используемой памяти