В 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
Please open Telegram to view this post
VIEW IN TELEGRAM
Деструктор объявляется с использованием синтаксиса
~ClassName
и не может иметь параметров или модификаторов доступа. Он вызывается не сразу, а в момент, когда GC решит освободить память.
class ResourceHolder
{
~ResourceHolder()
{
// Освобождение неуправляемых ресурсов
}
}
Деструкторы не гарантируют моментального вызова, поэтому для управления ресурсами рекомендуется использовать интерфейс
IDisposable
и паттерн Dispose
. Это позволяет явно освобождать ресурсы, не дожидаясь сборки мусора.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Please open Telegram to view this post
VIEW IN TELEGRAM
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
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
Please open Telegram to view this post
VIEW IN TELEGRAM
catch
без параметров перехватывает все исключения, независимо от их типа. Это полезно, когда нужно обработать любую ошибку, но нет необходимости знать её конкретный тип.
try
{
int result = 10 / int.Parse("0");
}
catch
{
Console.WriteLine("Произошла ошибка");
}
В этом примере, если возникает исключение (например, деление на ноль или ошибка парсинга), выполнение переходит в блок
catch
, где выводится сообщение об ошибке.Использование
catch
без параметров может скрыть важные детали об исключении, поэтому рекомендуется применять его с осторожностью и только в случаях, когда тип исключения действительно не важен.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Автосвойства:
public string Name { get; set; }
В этом случае компилятор автоматически создает скрытое поле для хранения значения и методы доступа.
Свойства с пользовательской логикой:
private int _age;
public int Age
{
get { return _age; }
set { _age = value > 0 ? value : 0; }
}
Здесь можно добавить проверки или преобразования при установке или получении значения.
Свойства могут быть только для чтения (только get) или только для записи (только set). Также можно использовать модификаторы доступа для get или set, чтобы ограничить доступ:
public string Password { get; private set; }
Это позволяет устанавливать значение только внутри класса.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Boxing происходит, когда тип-значение (например, `int`) преобразуется в объект ссылочного типа (`object`). При этом значение копируется в управляемую кучу, и создаётся ссылка на него.
int num = 42;
object boxed = num; // Boxing
Unboxing — это обратный процесс, когда значение из ссылочного типа извлекается обратно в тип-значение. При этом выполняется проверка типа, и значение копируется из кучи в стек.
int unboxed = (int)boxed; // Unboxing
Эти операции могут влиять на производительность, так как связаны с выделением памяти и копированием данных.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
namespace MyApp {
class Program {
static void Main() {
System.Console.WriteLine("Hello, World!");
}
}
}
Для доступа к элементам из другого пространства имен используется ключевое слово
using
.
using System;
namespace MyApp {
class Program {
static void Main() {
Console.WriteLine("Hello, World!");
}
}
}
Пространства имен упрощают структурирование больших проектов и предотвращают дублирование имен.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
DbSet
соответствует таблице в базе данных, а его элементы — строкам этой таблицы.
public class ApplicationContext : DbContext
{
public DbSet<User> Users { get; set; } // Представляет таблицу Users
}
DbSet
предоставляет методы для добавления, удаления и поиска данных. Например, Add()
добавляет новую сущность, а Find()
ищет по первичному ключу.
var user = new User { Name = "John" };
context.Users.Add(user); // Добавление сущности
context.SaveChanges(); // Сохранение изменений в базе
Используется в Entity Framework для работы с данными в объектно-ориентированном стиле.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
В этом примере LINQ используется для фильтрации чётных чисел из списка. Также LINQ поддерживает методы расширения, такие как
Where
, Select
, OrderBy
, что делает запросы более гибкими и выразительными. LINQ упрощает обработку данных и повышает читаемость кода.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM