Ключевые слова
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
Object
является фундаментальной концепцией, поскольку все классы неявно наследуются от Object
, даже если это не указано явно. Это означает, что каждый класс автоматически получает набор методов, определённых в Object
, таких как ToString()
, Equals()
, GetHashCode()
и GetType()
.ToString()
возвращает строковое представление объекта, что полезно для отладки и логирования. Equals()
позволяет сравнивать объекты на равенство, а GetHashCode()
возвращает числовое значение, используемое в хеш-таблицах. GetType()
предоставляет информацию о типе объекта во время выполнения.Object
обеспечивает базовую функциональность и полиморфизм, позволяя использовать объекты разных типов в унифицированной манере. Это также упрощает работу с коллекциями, такими как ArrayList
, которые могут хранить объекты любого типа.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
static
используется для объявления членов класса, которые принадлежат самому классу, а не его экземплярам. Такие методы и свойства можно вызывать без создания объекта класса. Например:public static class MathUtilities
{
public static int Add(int a, int b)
{
return a + b;
}
}
readonly
применяется для полей, значения которых могут быть установлены только один раз — либо при объявлении, либо в конструкторе класса. Это обеспечивает неизменяемость данных после инициализации. Пример:public class Configuration
{
public readonly string ConnectionString;
public Configuration(string connectionString)
{
ConnectionString = connectionString;
}
}
Использование
static
и readonly
помогает создавать более предсказуемый и безопасный код, улучшая его читаемость и поддержку.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1
Слабые ссылки (Weak References) позволяют ссылаться на объекты, не препятствуя их сборке мусора. Это полезно, когда необходимо отслеживать объект, но не удерживать его в памяти, если он больше не используется.
🟢 Слабая ссылка создается с помощью класса
🟢 Чтобы получить объект, нужно проверить его доступность:
Если объект был собран,
Ставь👍 , если было полезно!
Больше ответов на сайте👈
✈️ С# собеседования
WeakReference
. Например:WeakReference weakRef = new WeakReference(someObject);
if (weakRef.IsAlive)
{
var obj = weakRef.Target;
}
Если объект был собран,
weakRef.Target
вернет null
. Слабые ссылки помогают управлять памятью, избегая утечек.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
// Создание делегата с анонимным методом
Action<int> printSquare = delegate(int x)
{
// Вывод квадрата числа
Console.WriteLine(x * x);
};
// Вызов анонимного метода
printSquare(5); // Вывод: 25
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8✍1
public class WeakEventSource<TEventArgs> where TEventArgs : EventArgs {
private readonly List<WeakReference<EventHandler<TEventArgs>>> handlers = new();
public void Subscribe(EventHandler<TEventArgs> handler) {
handlers.Add(new WeakReference<EventHandler<TEventArgs>>(handler));
}
public void Raise(object sender, TEventArgs e) {
handlers.RemoveAll(h => !h.TryGetTarget(out _));
foreach (var weakHandler in handlers) {
if (weakHandler.TryGetTarget(out var handler)) {
handler(sender, e);
}
}
}
}
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
C# собеседования pinned «ℹ️ Подписывайся на наши новые каналы! 🖥 JS собеседования 🖥 Backend собеседования»
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3
Интерфейс
Ставь👍 , если было полезно!
Больше ответов на сайте👈
✈️ С# собеседования
IDisposable
используется для освобождения неуправляемых ресурсов, таких как файлы, сетевые соединения и другие ресурсы, которые требуют явного освобождения. Реализация IDisposable
включает метод Dispose
, который освобождает ресурсы.public class ResourceHolder : IDisposable
{
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Освобождение управляемых ресурсов
}
// Освобождение неуправляемых ресурсов
disposed = true;
}
}
~ResourceHolder()
{
Dispose(false);
}
}
IDisposable
позволяет управлять ресурсами, предотвращая утечки памяти.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2
Класс
1⃣
2⃣
3⃣
Ставь👍 , если было полезно!
Больше ответов на сайте👈
✈️ С# собеседования
Parallel
из пространства имен System.Threading.Tasks
упрощает многопоточность, позволяя выполнять циклы и вызовы методов параллельно.Parallel.For
используется для параллельного выполнения цикла for
. Он автоматически распределяет итерации между потоками.Parallel.For(0, 10, i => {
Console.WriteLine($"Processing {i}");
});
Parallel.ForEach
аналогичен, но применяется к коллекциям.var items = new List<int> { 1, 2, 3, 4, 5 };
Parallel.ForEach(items, item => {
Console.WriteLine($"Processing {item}");
});
Parallel.Invoke
позволяет выполнять несколько действий одновременно.Parallel.Invoke(
() => Console.WriteLine("Task 1"),
() => Console.WriteLine("Task 2")
);
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥1