Frontend

Что такое C#? Работа с классами и делегатами

1266
читать 2 мин.
18.10.24

В этом материале мы кратко расскажем о таком языке программирования, как C#.  Ты узнаешь о его типичных сферах использования и некоторых особенностях. А также мы разберем, что такое класс c#, метод c#, делегаты c# и c# функции. 

 

Вкратце о C#: c# классы и делегаты

 

C# (произносится «си шарп») — это без преувеличения один из самых распространенных в мире языков программирования с широким спектром сфер использования, среди которых:

  • разработка десктопных приложений для всех актуальных операционных систем (Microsoft Windows, Apple macOS и GNU/Linux);
  • создание мобильных приложений для платформ iOS и Android с помощью фреймворков Xamarin и .NET Core;
  • разработка разнообразных веб и облачных приложений, в том числе на базе платформы ASP.NET;
  • создание игр на всех платформах, включая PC (Windows), Xbox, PlayStation и других;
  • создание алгоритмов машинного обучения и других задач искусственного интеллекта, который сейчас у всех на слуху.

 

И это лишь несколько примеров применения C#, потому что этот язык имеет много функциональных возможностей и хорошую производительность, что позволяет использовать его в самых разных областях. Тем, кто размышляет о том, следует ли изучить именно этот язык, могут быть интересны некоторые его базовые особенности, такие как:

  • Объектно-ориентированный подход: C# построена на принципах объектно-ориентированного программирования, что позволяет легко расширять и вновь использовать существующий код. Классы, объекты, наследования, делегаты, полиморфизм и другие принципы ООП значительно упрощают создание сложных программ, которые к тому же легко расширяются.
  • Строгая типизация: C# имеет строгую типизацию, позволяющую компилятору проверять правильность типов данных при компиляции. За счет этого можно избежать многих ошибок, связанных с неправильными типами данных. Кроме того, имеется механизм обработки исключений, позволяющий обрабатывать ошибки во время выполнения программы. Это позволяет программе продолжать работу даже после возникновения ошибки.
  • Автоматическое управление памятью: C# имеет систему автоматического управления памятью. Это позволяет программисту не отвлекаться на высвобождение памяти после выполнения операций с объектами, что исключает большинство ошибок, связанных с памятью.
  • Интеграция с LINQ (Language Integrated Query): C# поддерживает язык запросов LINQ, что позволяет выполнять операции с данными непосредственно в коде программы. Интеграция C# с LINQ позволяет вместо, скажем, SQL, использовать язык запросов LINQ для выбора, фильтрации и манипулирования данными из баз напрямую, без необходимости использовать лишние конструкции кода.

На этом завершим нудноватый викиобразный экскурс в программирование для широкой публики и перейдем к основным понятиям. Они будут интересны более продвинутой аудитории, изучающей или размышляющей, нужно ли изучать C#.

 

Базовая информация о классах и делегатах

 

Начнем с классов. В первую очередь следует отметить, что в C# класс — это шаблон для создания объектов, содержащих поля (переменные) и методы (функции), выполняющие операции над этими полями. Классы позволяют использовать объектно-ориентированный подход к программированию.

Класс в C# может состоять из таких элементов, как:

  • Поля (fields) — переменные, сохраняющие состояние объекта.
  • Методы (methods) — функции в си шарп, выполняющие операции над полями класса.
  • Конструкторы (constructors) — специальные методы в си шарп, используемые для создания нового объекта.
  • Свойства (properties) — специальные методы, позволяющие считывать и записывать значения поля класса.
  • Индексаторы (indexers) — специальные методы, позволяющие объекту вести себя как массив.
  • События (events) — механизм, позволяющий объекту отслеживать события и реагировать на них.

Основная цель классов — обеспечение отделения и изоляции данных и функциональности. Это позволяет более эффективно использовать, поддерживать и дополнять код. Классы в C# могут быть унаследованы, и таким образом создавать более сложные структуры объектов.

Делегаты в C# — это типы, ссылающиеся на метод. К особенностям делегатов можно отнести следующее:

  1. Ссылка на метод: делегаты позволяют сохранять ссылку на метод, который можно вызвать позже в коде программы.
  2. Типизированность: делегаты типизированы, что позволяет компилятору при использовании делегатов проверить правильность их типов.
  3. Возможность передачи в метод: делегаты могут передаваться как аргументы в методы, позволяющие расширять функциональность программы.
  4. Возможность комбинирования: делегаты могут быть комбинированы с помощью операторов «+» и «-«, что позволяет добавлять или удалять методы, на которые ссылается делегат.
  5. Анонимность методов C# поддерживает анонимные методы, которые могут быть переданы как делегаты. Это позволяет использовать замыкания и лямбда-выражения.
  6. Поддержка событий: в C# делегаты поддерживают события, позволяющие создавать механизм отслеживания события и вызов методов, связанных с этим событием.

В целом делегаты позволяют передавать методы как параметры, комбинировать методы, создавать анонимные методы и поддерживать события, а также обеспечивают модульность и гибкость программы. 

 

Примеры базовых делегатов в C#

 

Action — делегат, который не возвращает значение, но принимает параметры. Он используется, когда требуется вызвать метод, который не возвращает никакое значение, но может выполнять определенные действия.

Делегат Action означает некоторое действие, которое ничего не возвращает, то есть имеет тип void:

 

public delegate void Action()

public delegate void Action<in T>(T obj)

 

У этого делегата есть несколько перегруженных версий, каждая из которых может принять разное количество параметров: от Action<in T1> до Action<in T1, in T2,…in T16>. То есть ему можно передать до 16 значений.

 

Обычно этот делегат является параметром метода и предполагает вызов определенных действий в ответ на предварительные результаты. Например:

DoOperation(10, 6, Add);        // 10 + 6 = 16

DoOperation(10, 6, Multiply);   // 10 * 6 = 60

void DoOperation(int a, int b, Action<int, int> op) => op(a, b);

void Add(int x, int y) => Console.WriteLine($»{x} + {y} = {x + y}»);

void Multiply(int x, int y) => Console.WriteLine($»{x} * {y} = {x * y}»);

 

Func — делегат, принимающий один или несколько параметров и возвращающий значение. Он используется, когда нужно вызвать метод, возвращающий значение.

Func возвращает результат и может принимать параметры. Он также имеет различные формы: от Func<out T>(), в котором T — тип возвращаемого значения до Func<in T1, in T2,…in T16, out TResult>(), то есть он тоже может принимать до 16 параметров.

TResult Func<out TResult>()

TResult Func<in T, out TResult>(T arg)

TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)

TResult Func<in T1, in T2, in T3, out TResult>(T1 arg1, T2 arg2, T3 arg3)

TResult Func<in T1, in T2, in T3, in T4, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)

//…………………………………….

Этот делегат также часто используется в качестве параметра в методах:

int result1 = DoOperation(6, DoubleNumber); // 12

Console.WriteLine(result1);

int result2 = DoOperation(6, SquareNumber); // 36

Console.WriteLine(result2);

int DoOperation(int n, Func<int, int> operation) => operation(n);

int DoubleNumber(int n) => 2 * n;

int SquareNumber(int n) => n * n;

 

Метод DoOperation() в качестве параметра принимает делегат Func<int, int>, а именно ссылку на метод, принимающий число int, и возвращающий значение такого же типа int.

При первом вызове метода DoOperation() ему передается ссылка на метод DoubleNumber, увеличивающий число вдвое. Во втором случае передается метод SquareNumber, который возводит число в квадрат и возвращает полученное значение.

Predicate — делегат, принимающий один параметр и возвращающий логическое значение типа bool. Он используется, когда требуется вызвать метод, проверяющий, удовлетворяет ли определенный объект заданный критерий.

Делегат Predicate принимает только один параметр и возвращает значение типа bool:

delegate bool Predicate<in T>(T obj);

 

Чаще всего данный предикат используется для сравнения некоторого объекта T с определенным условием. Если условие соблюдено, возвращается значение true, и если нет, то значение false:

Predicate<int> isPositive = (int x) => x > 0;

Console.WriteLine(isPositive(20));

Console.WriteLine(isPositive(-20));

 

В данном примере возвращается true или false в зависимости от того, больше ли число нуля или нет.

 

Вывод

В статье мы рассмотрели, что такое язык C#, классы, делегаты и как с ними работать. И это даже не вся вершина айсберга. В языке C# существует множество других типов делегатов. Но рассмотренные три делегата гораздо более распространенные и чаще других используются на практике.