Event — это механизм, который позволяет объектам уведомлять другие объекты о произошедших действиях. Он основан на делегатах и используется для реализации шаблона "наблюдатель", где один объект может подписаться на события другого объекта и реагировать на них.
Объявление события включает делегат, который определяет сигнатуру методов-обработчиков. События обычно используются в графических интерфейсах и других системах, где требуется реагировать на действия пользователя или изменения состояния.
Пример объявления и использования события:
public class Publisher
{
public event EventHandler SomethingHappened;
public void TriggerEvent()
{
SomethingHappened?.Invoke(this, EventArgs.Empty);
}
}
public class Subscriber
{
public void OnSomethingHappened(object sender, EventArgs e)
{
// Реакция на событие
}
}
События обеспечивают гибкость и модульность, позволяя объектам взаимодействовать без жесткой связи.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Entity Framework (EF) — это ORM (Object-Relational Mapping) фреймворк, который упрощает доступ к данным в приложениях C#. Он позволяет работать с базами данных, используя объекты, вместо прямого взаимодействия с SQL-запросами.
Для использования EF необходимо:
1. Установить пакет: Добавить Entity Framework в проект через NuGet.
2. Создать модель данных: Определить классы, представляющие таблицы базы данных. Например:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
3. Настроить контекст данных: Создать класс, наследующий
DbContext
, который управляет объектами и их сохранением в базе данных.
public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
4. Выполнять операции с данными: Использовать LINQ для выполнения CRUD-операций.
using (var context = new AppDbContext())
{
var products = context.Products.Where(p => p.Price > 100).ToList();
}
Entity Framework автоматизирует многие аспекты работы с базами данных, позволяя сосредоточиться на логике приложения.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
Классы
Directory
и DirectoryInfo
в C# предоставляют методы для работы с файловыми системами, позволяя управлять директориями.Directory
— это статический класс, который предоставляет методы для создания, перемещения, удаления и перечисления директорий. Пример использования:
// Создание директории
Directory.CreateDirectory(@"C:\ExampleDir");
// Проверка существования
bool exists = Directory.Exists(@"C:\ExampleDir");
// Удаление директории
Directory.Delete(@"C:\ExampleDir");
DirectoryInfo
— это класс, который предоставляет аналогичные возможности, но через экземпляры, что позволяет сохранять состояние и информацию о директории. Пример:
var dirInfo = new DirectoryInfo(@"C:\ExampleDir");
// Создание директории
dirInfo.Create();
// Получение информации о файлах
FileInfo[] files = dirInfo.GetFiles();
// Удаление директории
dirInfo.Delete();
Оба класса позволяют управлять файловой системой, но
DirectoryInfo
удобен для работы с объектами, когда требуется доступ к свойствам директории.Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Паттерн Observer — это поведенческий шаблон проектирования, который определяет зависимость "один ко многим" между объектами. Он позволяет одному объекту (наблюдаемому) уведомлять другие объекты (наблюдатели) о произошедших изменениях в его состоянии.
Основные компоненты паттерна:
1. Субъект (Subject): Объект, за которым наблюдают. Он хранит список наблюдателей и предоставляет методы для добавления и удаления наблюдателей.
2. Наблюдатель (Observer): Интерфейс или абстрактный класс, который определяет метод обновления, вызываемый субъектом для уведомления об изменениях.
3. Конкретные субъекты и наблюдатели: Реализуют интерфейсы субъекта и наблюдателя, определяя конкретное поведение при изменении состояния.
Пример реализации на C#:
public interface IObserver
{
void Update(string state);
}
public class ConcreteObserver : IObserver
{
public void Update(string state)
{
Console.WriteLine($"Observer notified with state: {state}");
}
}
public class Subject
{
private List<IObserver> observers = new List<IObserver>();
private string state;
public void Attach(IObserver observer) => observers.Add(observer);
public void Detach(IObserver observer) => observers.Remove(observer);
public void Notify()
{
foreach (var observer in observers)
{
observer.Update(state);
}
}
public string State
{
get => state;
set
{
state = value;
Notify();
}
}
}
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Индексаторы в C# позволяют объектам действовать как массивы. Они предоставляют синтаксический сахар для доступа к элементам объекта по индексу, что делает код более читаемым и удобным.
Индексаторы определяются с помощью ключевого слова
this
, за которым следует параметр в квадратных скобках. Например:
public class SampleCollection<T>
{
private T[] arr = new T[100];
public T this[int i]
{
get { return arr[i]; }
set { arr[i] = value; }
}
}
В этом примере класс
SampleCollection
позволяет доступ к элементам массива arr
через индексатор. Это упрощает работу с коллекциями, предоставляя интерфейс, аналогичный массивам, без необходимости раскрывать внутреннюю структуру данных. Индексаторы полезны в случаях, когда требуется предоставить доступ к элементам объекта по индексу, сохраняя инкапсуляцию.Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Ключевое слово
sealed
в C# используется для ограничения наследования. Sealed класс — это класс, который нельзя наследовать. Использование
sealed
предотвращает создание подклассов, что может быть полезно для повышения безопасности и производительности. Например:
public sealed class FinalClass
{
// Код класса
}
Sealed метод — это метод, который нельзя переопределить в производных классах. Он применяется только к методам, унаследованным от базового класса, и требует, чтобы метод был помечен как
override
. Например:
public class BaseClass
{
public virtual void Display() { }
}
public class DerivedClass : BaseClass
{
public sealed override void Display() { }
}
Использование
sealed
помогает контролировать поведение классов и методов, предотвращая нежелательные изменения в наследуемых структурах.Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7✍1
Конструктор — это специальный метод класса, который вызывается при создании нового экземпляра этого класса. Он инициализирует объект, устанавливая начальные значения его полей и выполняя другие необходимые действия. Конструкторы могут быть перегружены, что позволяет создавать несколько версий с разными параметрами.
Пример конструктора:
public class MyClass
{
public int Value;
public MyClass(int initialValue)
{
Value = initialValue;
}
}
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
where
в LINQ — это оператор, используемый для фильтрации коллекций на основе заданного условия. Он позволяет выбрать только те элементы, которые удовлетворяют определенному предикату, и исключить остальные из результата.Синтаксис
where
в LINQ-запросах напоминает SQL и делает код более читаемым и выразительным. Он может быть использован как в методах расширения, так и в синтаксисе запросов.Пример использования
where
в LINQ:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
В этом примере
where
фильтрует список numbers
, выбирая только четные числа. Результатом будет коллекция, содержащая числа 2 и 4.Использование
where
позволяет эффективно работать с данными, извлекая только нужные элементы из коллекций.Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
Оператор
using
используется для управления ресурсами, которые требуют явного освобождения, такими как файлы, сетевые соединения или объекты, работающие с базами данных. Он гарантирует, что метод Dispose()
будет вызван для объекта, реализующего интерфейс IDisposable
, как только объект выходит из области видимости.Существует два основных способа использования оператора
using
. Первый — это использование в виде инструкции:
using (var resource = new Resource())
{
// Работа с ресурсом
}
В этом случае
Dispose()
вызывается автоматически, когда блок using
завершается.Второй способ — это использование в виде директивы, которая позволяет импортировать пространство имен:
using System.Text;
Это упрощает доступ к типам в пространстве имен, устраняя необходимость указывать полное имя типа.
Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2🔥2
Ключевые слова
virtual
и override
используются для реализации полиморфизма, позволяя производным классам изменять поведение методов, определённых в базовом классе.Ключевое слово
virtual
используется в базовом классе для обозначения метода, который может быть переопределён в производных классах:
public class BaseClass
{
public virtual void Display()
{
Console.WriteLine("Base Display");
}
}
Ключевое слово
override
используется в производном классе для переопределения метода, помеченного как virtual
в базовом классе:
public class DerivedClass : BaseClass
{
public override void Display()
{
Console.WriteLine("Derived Display");
}
}
При вызове метода
Display
через экземпляр DerivedClass
, будет выполнена переопределённая версия метода. Это позволяет изменять поведение методов в зависимости от типа объекта.Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2💯2
This
и base
— ключевые слова, которые используются для работы с объектами и наследованием.this.fieldName
позволяет явно указать, что обращение идет к полю класса, а не к локальной переменной.base.MethodName()
вызывает метод базового класса, даже если он переопределен в текущем классе.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2
IDisposable
.Конструкция
using
автоматически вызывает метод Dispose()
для объекта, когда выполнение блока кода завершается, даже если произошло исключение. Это гарантирует освобождение ресурсов своевременно и безопасно.Пример использования:
using (var fileStream = new FileStream("file.txt", FileMode.Open))
{
// Работа с файлом
}
fileStream
будет закрыт автоматически после завершения блока using
, что предотвращает утечки ресурсов.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
ref
и out
используются для передачи аргументов в методы по ссылке, что позволяет методам изменять значения этих аргументов.void ModifyRef(ref int number) {
number += 10;
}
int value = 5;
ModifyRef(ref value);
// value теперь равно 15
void GetValues(out int x, out int y) {
x = 10;
y = 20;
}
int a, b;
GetValues(out a, out b);
// a равно 10, b равно 20
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Событие — это механизм, позволяющий объектам уведомлять другие объекты о произошедших действиях. События часто используются в графических интерфейсах для обработки пользовательских действий, таких как нажатия кнопок.
✔️ События объявляются с использованием делегатов. Делегат определяет сигнатуру метода, который будет вызван при возникновении события.
✔️ Для вызова события используется метод, который проверяет, есть ли подписчики:
Ставь👍 , если было полезно!
Больше ответов на сайте👈
✈️ С# собеседования
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler MyEvent;
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
В C# стандартный делегат для обработки событий - EventHandler, который принимает два параметра: object sender (источник события) и EventArgs e (аргументы события).
Пример объявления и использования:
public event EventHandler MyEvent;
private void OnMyEvent()
{
MyEvent?.Invoke(this, EventArgs.Empty);
}
// Подписка на событие
someObject.MyEvent += HandleMyEvent;
private void HandleMyEvent(object sender, EventArgs e)
{
// Обработка события
}
Event Handler позволяет реализовать слабую связность между компонентами и является ключевым элементом событийно-ориентированного программирования.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🔥1🤔1
Композиция и агрегация — это два типа отношений между объектами в объектно-ориентированном программировании.
➡️ Композиция — это сильная связь, при которой один объект владеет другим и отвечает за его жизненный цикл. Если контейнерный объект уничтожается, то и содержащийся объект тоже уничтожается. Пример: класс "Автомобиль" и класс "Двигатель".
➡️ Агрегация — это более слабая связь, где объект может существовать независимо от контейнера. Пример: класс "Университет" и класс "Студент". Студент может существовать вне университета.
Ставь👍 , если было полезно!
Больше ответов на сайте👈
✈️ С# собеседования
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
async
и await
— ключевые слова, которые упрощают работу с асинхронным программированием. async
используется для обозначения метода как асинхронного, что позволяет выполнять операции без блокировки основного потока. Такой метод возвращает Task
или Task<T>
. await
применяется внутри асинхронного метода для приостановки выполнения до завершения асинхронной операции. Это позволяет писать асинхронный код, который выглядит как синхронный, улучшая читаемость и поддерживаемость.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🤔1
public class Person
{
public required string Name { get; init; }
public int Age { get; init; }
}
// Использование
var person = new Person { Name = "Alice", Age = 30 }; // Корректно
var personWithoutName = new Person { Age = 25 }; // Ошибка: Name обязателен
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4
Для сериализации и десериализации объектов в C# используется пространство имен
🔘 Сериализация: создается объект
🔘 Десериализация: используется метод
Ставь👍 , если было полезно!
Больше ответов на сайте👈
✈️ С# собеседования
System.Runtime.Serialization
. Один из популярных способов — использование DataContractSerializer
.DataContractSerializer
, которому передается тип объекта. Затем вызывается метод WriteObject
, который записывает объект в поток.ReadObject
, который считывает объект из потока.using System.Runtime.Serialization;
using System.IO;
[DataContract]
class Person
{
[DataMember]
public string Name { get; set; }
}
var person = new Person { Name = "John" };
var serializer = new DataContractSerializer(typeof(Person));
using (var stream = new FileStream("person.xml", FileMode.Create))
{
serializer.WriteObject(stream, person);
}
using (var stream = new FileStream("person.xml", FileMode.Open))
{
var deserializedPerson = (Person)serializer.ReadObject(stream);
}
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3