C# собеседования
753 subscribers
104 photos
222 links
Подготовка к собеседованиям на позицию C#-разработчик

Еще больше на сайте https://frontview-it.ru

Backend собеседования - @frontview_backend
C# работа - @frontview_csharp_vacancies
Все IT вакансии - @frontview_all_vacancies
Download Telegram
😎 Ключевое слово 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
👍101
Слабые ссылки (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
👍81
📌Слабые события — это механизм, позволяющий избежать утечек памяти, связанных с событиями. В стандартной реализации событий подписчики удерживаются сильными ссылками, что может препятствовать сборке мусора для объектов, которые больше не используются.

🟡 Слабые события используют слабые ссылки на обработчики, позволяя сборщику мусора освобождать объекты, даже если они подписаны на события.

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 собеседования»
Сборщик мусора можно вызвать вручную с помощью метода GC.Collect(), однако это редко оправдано, так как сборщик мусора оптимизирован для автоматического управления памятью. Ручной вызов может быть полезен в ситуациях, когда необходимо освободить значительное количество памяти перед выполнением ресурсоемкой операции, но следует использовать его с осторожностью, чтобы избежать снижения производительности.

✈️ С# собеседования
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
👍82
Класс Parallel из пространства имен System.Threading.Tasks упрощает многопоточность, позволяя выполнять циклы и вызовы методов параллельно.

1⃣ Parallel.For используется для параллельного выполнения цикла for. Он автоматически распределяет итерации между потоками.

Parallel.For(0, 10, i => {
Console.WriteLine($"Processing {i}");
});


2⃣ Parallel.ForEach аналогичен, но применяется к коллекциям.

var items = new List<int> { 1, 2, 3, 4, 5 };
Parallel.ForEach(items, item => {
Console.WriteLine($"Processing {item}");
});


3⃣ Parallel.Invoke позволяет выполнять несколько действий одновременно.

Parallel.Invoke(
() => Console.WriteLine("Task 1"),
() => Console.WriteLine("Task 2")
);


Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥1
➡️ Полиморфизм позволяет объектам обрабатывать вызовы методов по-разному в зависимости от их конкретного типа. Это достигается через наследование и интерфейсы.

➡️ Ключевой механизм полиморфизма — виртуальные методы. Базовый класс объявляет метод как virtual, а производные классы могут переопределять его с помощью override.

public class Animal
{
public virtual void Speak()
{
// Базовая реализация
Console.WriteLine("Animal speaks");
}
}

public class Dog : Animal
{
public override void Speak()
{
// Переопределение метода
Console.WriteLine("Dog barks");
}
}


➡️ Полиморфизм позволяет использовать объекты производных классов через ссылки на базовые классы, сохраняя их уникальное поведение.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14💯1
Array имеет фиксированный размер, определяемый при создании, и не может быть изменен, что делает его более эффективным по памяти, но менее гибким. List — это динамическая коллекция, которая автоматически изменяет свой размер при добавлении или удалении элементов, предоставляя больше гибкости и удобства в использовании.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3🤔1
CLR (Common Language Runtime) — это виртуальная машина, являющаяся частью .NET Framework, которая управляет выполнением программ, написанных на языках, поддерживающих .NET, таких как C#. Основные функции CLR включают:

1️⃣ Управление памятью: автоматическое управление памятью через сборку мусора.
2️⃣ Обеспечение безопасности: проверка типов и защита кода.
3️⃣ Обработка исключений: централизованная обработка ошибок.
4️⃣ Поддержка многопоточности: управление потоками выполнения.

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

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
Сборка мусора в .NET автоматически управляет памятью, освобождая её от объектов, которые больше не используются приложением, тем самым предотвращая утечки памяти. Этот процесс включает в себя три поколения объектов, где объекты, которые переживают сборку мусора, перемещаются в более высокое поколение, что оптимизирует производительность за счёт реже проводимой очистки для долгоживущих объектов.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
🖇 Делегат — это тип, который представляет ссылки на методы с определенной сигнатурой. Делегаты позволяют инкапсулировать метод в объект и передавать его как параметр другим методам. Это особенно полезно для реализации событий и обратных вызовов.


// Объявление делегата, который принимает два целых числа и возвращает целое число
public delegate int Operation(int x, int y);

// Метод, соответствующий делегату
public int Add(int a, int b)
{
return a + b;
}

// Использование делегата
Operation op = Add;
int result = op(3, 4); // Вызов метода через делегат


✔️ Делегаты обеспечивают гибкость и расширяемость кода, позволяя динамически изменять поведение программы.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
⚡️ Паттерн Singleton гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к нему. Это полезно для управления ресурсами или состоянием, которые должны быть уникальными в приложении.


using System;

// Класс Singleton
public class Singleton {
private static Singleton instance;

// Приватный конструктор
private Singleton() {}

// Метод для получения единственного экземпляра
public static Singleton Instance {
get {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

public void ShowMessage() {
Console.WriteLine("Singleton instance");
}
}

class Program {
static void Main() {
Singleton singleton = Singleton.Instance;
singleton.ShowMessage(); // Вывод: Singleton instance
}
}


🟢 Конструктор Singleton закрыт, чтобы предотвратить создание новых экземпляров. Метод Instance обеспечивает доступ к единственному экземпляру.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🤔2🤩1
CTS (Common Type System) в .NET определяет, как типы данных должны быть объявлены, использованы и управляемы в среде выполнения, обеспечивая совместимость между языками. CLS (Common Language Specification) представляет собой набор правил и ограничений, которые обеспечивают совместимость между различными языками .NET, позволяя им взаимодействовать друг с другом.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Boxing — это процесс преобразования значимого типа (например, int) в ссылочный тип object, что позволяет хранить значимые типы в структурах данных, предназначенных для объектов. Unboxing — это обратный процесс, когда объектный тип преобразуется обратно в значимый тип.


int number = 42; // Значимый тип
object boxed = number; // Boxing: преобразование в object
int unboxed = (int)boxed; // Unboxing: преобразование обратно в int


💡 Boxing и unboxing могут влиять на производительность, так как требуют дополнительных операций в памяти.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Entity Framework — это объектно-реляционный маппер (ORM) для .NET, который упрощает взаимодействие с базами данных, позволяя работать с данными в виде объектов C#. Он автоматизирует задачи, связанные с доступом к данным, такие как создание SQL-запросов и управление соединениями, что ускоряет разработку и снижает количество ошибок.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥5
Array и List<T> — это коллекции, но они имеют ключевые различия.

1️⃣ Array — это фиксированная по размеру коллекция, которая хранит элементы одного типа. Размер массива задается при создании и не может быть изменен. Это делает массивы быстрыми и эффективными по памяти, но менее гибкими.

int[] numbers = new int[5]; // Массив фиксированного размера


2️⃣ List<T> — это динамическая коллекция, которая может изменять размер. Она предоставляет методы для добавления, удаления и управления элементами, что делает ее более гибкой, но с небольшими накладными расходами по сравнению с массивами.

List<int> numbers = new List<int>(); // Динамический список
numbers.Add(1); // Добавление элемента


Array подходит для сценариев, где известен размер данных, а List<T> — для работы с изменяющимися данными.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
Синхронное программирование выполняет задачи последовательно, блокируя выполнение до завершения каждой операции, что может приводить к задержкам при ожидании ресурсов. Асинхронное программирование позволяет выполнять задачи параллельно, не блокируя поток, что улучшает отзывчивость приложений, особенно при работе с вводом-выводом или сетевыми запросами.

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
using выполняет две основные функции: импорт пространств имен и управление ресурсами.

1️⃣ Первая функция — импорт пространств имен, что позволяет использовать классы и методы без полного указания их путей. Например:


using System; // Импорт пространства имен System

Console.WriteLine("Hello, World!"); // Использование метода из System


2️⃣ Вторая функция — управление ресурсами. using создает блок, который автоматически освобождает ресурсы, реализующие интерфейс IDisposable, по завершении блока. Это полезно для работы с файлами, потоками и соединениями с базой данных:


using (var file = new StreamWriter("file.txt")) {
// Запись в файл
file.WriteLine("Hello, World!");
} // Автоматическое закрытие файла


Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С# собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4