Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
using System;
using System.Threading.Tasks;
class Program {
static void Main() {
Task<int> task = Task.Run(() => {
// Выполняемая задача
return 42;
});
task.ContinueWith(t => {
// Продолжение после завершения задачи
Console.WriteLine($"Result: {t.Result}");
});
Console.ReadLine();
}
}
ContinueWith() позволяет организовать асинхронное выполнение, улучшая читаемость и управление потоками.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
==
и Equals
— операторы сравнения, но работают по-разному. ==
проверяет равенство ссылок для ссылочных типов и значение для примитивных типов. Его поведение можно переопределить.
string a = "hello";
string b = "hello";
bool result = (a == b); // true, сравнивает значения строк
Equals
— метод, который сравнивает содержимое объектов. По умолчанию, для ссылочных типов проверяет равенство ссылок, но может быть переопределён для сравнения содержимого.
object obj1 = new object();
object obj2 = new object();
bool isEqual = obj1.Equals(obj2); // false, разные объекты
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍5
Queue (очередь) работает по принципу FIFO (First In, First Out), где первый добавленный элемент будет первым извлечён. Это полезно для задач, где порядок обработки важен, например, в очередях задач.
Stack (стек) работает по принципу LIFO (Last In, First Out), где последний добавленный элемент будет первым извлечён. Это удобно для задач, связанных с отменой операций или рекурсией.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
// Создание и использование очереди
Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);
Console.WriteLine(queue.Dequeue()); // Выводит 1
// Создание и использование стека
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
Console.WriteLine(stack.Pop()); // Выводит 2
}
}
Queue и Stack обеспечивают эффективное управление элементами в различных сценариях.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
Блок try используется для оборачивания кода, который может вызвать исключение. Если в этом блоке происходит ошибка, управление передается в ближайший блок catch.
Блок catch перехватывает исключение и позволяет выполнить код для обработки ошибки. Можно указать специфичный тип исключения для обработки или использовать базовый класс Exception.
Блок finally выполняется в любом случае, независимо от того, произошло исключение или нет. Этот блок обычно используется для освобождения ресурсов.
try
{
// Ошибочный код
int result = 10 / int.Parse("0");
}
catch (DivideByZeroException ex)
{
// Обработка деления на ноль
Console.WriteLine("Ошибка: деление на ноль.");
}
catch (FormatException ex)
{
// Обработка неверного формата
Console.WriteLine("Ошибка: неверный формат числа.");
}
finally
{
// Код, выполняющийся всегда
Console.WriteLine("Завершение блока try-catch-finally.");
}
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥1
В C# инкапсуляция достигается с помощью модификаторов доступа:
- private: Доступ только внутри класса.
- protected: Доступ внутри класса и производных классов.
- public: Доступ из любого места.
- internal: Доступ в пределах сборки.
class Account {
private decimal balance; // Скрытое поле
public void Deposit(decimal amount) {
if (amount > 0) balance += amount; // Контролируемое изменение
}
public decimal GetBalance() {
return balance; // Контролируемый доступ
}
}
В этом примере поле
balance
скрыто, а методы Deposit
и GetBalance
предоставляют контролируемый доступ к нему. Инкапсуляция повышает безопасность и упрощает поддержку кода.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
Деструктор объявляется с использованием синтаксиса
~ClassName
и не может иметь параметров или модификаторов доступа. Он вызывается не сразу, а в момент, когда GC решит освободить память.
class ResourceHolder
{
~ResourceHolder()
{
// Освобождение неуправляемых ресурсов
}
}
Деструкторы не гарантируют моментального вызова, поэтому для управления ресурсами рекомендуется использовать интерфейс
IDisposable
и паттерн Dispose
. Это позволяет явно освобождать ресурсы, не дожидаясь сборки мусора.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
ref
и out
используются для передачи аргументов по ссылке, но имеют важные различия. - ref: требует, чтобы переменная была инициализирована перед передачей в метод. Метод может как читать, так и изменять значение переданной переменной.
- out: не требует инициализации переменной перед передачей. Метод обязан присвоить значение переменной перед завершением, так как она предназначена только для вывода данных.
Пример:
void ModifyWithRef(ref int x) {
x += 10; // Может читать и изменять значение
}
void ModifyWithOut(out int y) {
y = 20; // Обязан присвоить значение
}
ref
используется, когда нужно изменить существующее значение, а out
— когда метод должен вернуть новое значение.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2⚡2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
enum DayOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
В этом примере создается перечисление
DayOfWeek
, представляющее дни недели. Каждый элемент имеет числовое значение, начиная с 0 (Monday = 0, Tuesday = 1 и т.д.).
DayOfWeek today = DayOfWeek.Friday;
if (today == DayOfWeek.Friday)
{
Console.WriteLine("Сегодня пятница!");
}
Здесь переменной
today
присваивается значение Friday
, и выполняется проверка на соответствие этому значению. Использование enum делает код более понятным и безопасным.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
Task
используется для операций, которые не возвращают результат, а Task<T>
— для операций, возвращающих результат типа T
.
Task.Run(() =>
{
Console.WriteLine("Асинхронная операция без возврата значения");
});
Здесь создается задача, которая выполняется асинхронно и не возвращает результат.
Task<int> task = Task.Run(() =>
{
return 42;
});
int result = await task;
Console.WriteLine(result);
В этом примере
Task<int>
используется для асинхронной операции, возвращающей число. Результат можно получить с помощью await
. Task
и Task<T>
упрощают работу с асинхронным кодом, позволяя эффективно управлять потоками и ресурсами.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3👀1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
catch
без параметров перехватывает все исключения, независимо от их типа. Это полезно, когда нужно обработать любую ошибку, но нет необходимости знать её конкретный тип.
try
{
int result = 10 / int.Parse("0");
}
catch
{
Console.WriteLine("Произошла ошибка");
}
В этом примере, если возникает исключение (например, деление на ноль или ошибка парсинга), выполнение переходит в блок
catch
, где выводится сообщение об ошибке.Использование
catch
без параметров может скрыть важные детали об исключении, поэтому рекомендуется применять его с осторожностью и только в случаях, когда тип исключения действительно не важен.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1