C# | Вопросы собесов
5.1K subscribers
34 photos
1 file
980 links
Download Telegram
🤔 Что такое делегаты и зачем они нужны?

Делегаты в C# — это типы, которые представляют собой ссылки на методы с определенной сигнатурой. Делегаты позволяют передавать методы в качестве параметров другим методам, что делает код более гибким и модульным. Делегаты используются для обратных вызовов (callbacks), событий и многопоточности. Они являются основой событийной модели C# и упрощают взаимодействие между объектами.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
🤔 Что такое типизация .NET, какие есть типы?

Это система, определяющая типы данных, которые могут использоваться в программе. Типы данных в .NET делятся на два больших класса: значимые типы (value types) и ссылочные типы (reference types). Каждый из них имеет свои особенности и используется в различных ситуациях.

🚩Значимые типы (Value Types)

Хранят свои значения непосредственно. Они создаются в стеке и имеют фиксированный размер.

🟠Примитивные типы
Такие как int, float, double, bool, char, и другие. Пример: int x = 10;

🟠Структуры (structs)
Пользовательские типы данных, которые могут содержать примитивные типы и другие структуры.
struct Point
{
public int X;
public int Y;
}


🟠Перечисления (enums)
Наборы именованных констант.
enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }


🚩Ссылочные типы (Reference Types)

Хранят ссылку на объект, который размещен в управляемой куче (heap). Они могут иметь переменный размер. Примеры ссылочных типов включают:

🟠Классы (classes)
Могут содержать поля, свойства, методы и события.
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}


🟠Интерфейсы (interfaces)
Описывают контракт, который должны реализовать классы.
interface IMovable
{
void Move();
}


🟠Делегаты (delegates)
Указатели на методы, которые могут быть вызваны позже.
delegate void Notify(string message);


🟠Массивы (arrays)
Наборы элементов одного типа.
int[] numbers = { 1, 2, 3, 4, 5 };


🟠Строки (strings)
Последовательности символов. Пример: string greeting = "Hello, world!";

🚩Разница между значимыми и ссылочными типами

🟠Значимые типы
Создаются в стеке и передаются по значению. Это означает, что при передаче значимого типа создается его копия.
🟠Ссылочные типы
Создаются в куче, и переменные содержат ссылки на их адреса. При передаче ссылочного типа передается сама ссылка, а не копия объекта.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3
🤔 Что такое String?

`String` в C# — это класс, представляющий неизменяемую последовательность символов. Каждый раз, когда строка изменяется, создаётся новый объект `String`, а старый объект остаётся в памяти до сборки мусора. Строки поддерживают методы для работы с текстом, такие как конкатенация, сравнение и поиск подстрок. Так как строки неизменяемы, для частых изменений строк предпочтительнее использовать `StringBuilder`.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1
🤔 Какая типизация в C#?

Является статической, строгой и безопасной, что означает, что типы данных проверяются на этапе компиляции, типы данных должны строго соответствовать ожиданиям, и это предотвращает многие типичные ошибки во время выполнения.

🟠Статическая типизация
Использует статическую типизацию, что означает, что типы переменных определяются и проверяются на этапе компиляции. Компилятор проверяет, чтобы все операции с этими переменными соответствовали их типам.
int number = 10; // Переменная number имеет тип int
string text = "Hello"; // Переменная text имеет тип string


🟠Строгая типизация
Означает, что типы данных должны строго соответствовать ожиданиям.
int number = 10;
string text = "Hello";

// Это вызовет ошибку компиляции
// number = text;

// Необходимо явное преобразование
number = int.Parse("123");


🟠Безопасность типов
Означает, что предпринимаются меры для предотвращения ошибок, связанных с неправильным использованием типов. Например, вы не можете выполнить операцию, не совместимую с типом данных:

int number = 10;

// Это вызовет ошибку компиляции
// number = number + "text";


🟠Значимые типы (Value Types)
Значимые типы хранят свои значения непосредственно и создаются в стеке. Они включают:

🟠Примитивные типы
int, float, double, bool, char
🟠Структуры
Пользовательские типы, определяемые с помощью struct
🟠Перечисления
Наборы именованных констант, определяемые с помощью enum

Пример класса
struct Point
{
public int X;
public int Y;
}


🚩Ссылочные типы (Reference Types)

Ссылочные типы хранят ссылку на объект, который размещен в куче. Они включают:
🟠Классы
Могут содержать поля, свойства, методы и события
🟠Интерфейсы
Описывают контракт, который должны реализовать классы
🟠Делегаты
Указатели на методы
🟠Массивы
Наборы элементов одного типа
🟠Строки
Последовательности символов

Пример класса
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 Что такое IQueryable?

`IQueryable` — это интерфейс, который позволяет строить и выполнять запросы к данным с отложенным выполнением (lazy loading). Он часто используется для создания запросов в LINQ к базам данных, поскольку позволяет серверу базы данных выполнить запрос, минимизируя нагрузку на память и процессор. `IQueryable` также поддерживает сложные запросы, такие как фильтрация, сортировка и агрегация, до фактического получения данных. Это делает его эффективным инструментом для работы с большими наборами данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥10
🤔 Что такое строгая типизация?

Это характеристика языков программирования, при которой каждое выражение имеет строго определённый тип, и не допускаются неявные (автоматические) преобразования между типами, если они могут привести к ошибкам. В языках с строгой типизацией компилятор или интерпретатор проверяет типы данных на этапе компиляции или выполнения, чтобы предотвратить возможные ошибки.

🚩Характеристики

🟠Типы данных определены на этапе компиляции
Типы переменных и выражений известны и проверяются во время компиляции.
🟠Отсутствие неявных преобразований
Автоматические преобразования между несовместимыми типами не допускаются. Например, строка не может быть неявно преобразована в целое число.
🟠Явные преобразования
Если преобразование необходимо, программист должен явно указать это в коде, используя приведение типов.
🟠Безопасность типов
Программа предотвращает операции, которые могут привести к ошибкам из-за несовместимости типов.

🚩Примеры

Примитивные типы
int number = 10;
string text = "Hello";

// Это вызовет ошибку компиляции, потому что `text` нельзя неявно преобразовать в `int`
// number = text;

// Необходимо явное преобразование
number = int.Parse("123"); // Явное преобразование строки в целое число


Классы и объекты
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

Person person = new Person();
person.Name = "John";
person.Age = 30;

// Это вызовет ошибку компиляции, так как типы не совместимы
// person.Age = "Thirty";

// Явное преобразование строки в целое число
person.Age = int.Parse("30");


🚩Плюсы и минусы

Обнаружение ошибок на этапе компиляции
Многие типичные ошибки могут быть обнаружены и исправлены еще до выполнения программы.
Улучшенная читабельность и поддержка кода
Явные типы и преобразования делают код более понятным.
Оптимизация производительности
Компилятор может более эффективно оптимизировать код, так как типы данных известны заранее.
Большая объемность кода
Необходимость явных преобразований может увеличить объем кода.
Меньшая гибкость
Программисты могут столкнуться с ограничениями при работе с разнородными типами данных.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое Rest?

REST (Representational State Transfer) — это архитектурный стиль для создания веб-сервисов, использующий стандартные методы HTTP, такие как GET, POST, PUT и DELETE. RESTful API представляет ресурсы в виде URL, а взаимодействие с ними происходит через стандартные протоколы без сохранения состояния между запросами. REST обеспечивает простоту, масштабируемость и независимость компонентов, что делает его популярным выбором для создания распределённых систем. Основные принципы REST включают унифицированный интерфейс и клиент-серверную архитектуру.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥3
🤔 Какие тесты бывают?

🚩Виды

🟠Юнит-тесты
Предназначены для проверки отдельных компонентов или модулей приложения в изоляции. Они помогают убедиться, что отдельные функции или методы работают правильно.
Цель: Проверка логики отдельных методов или классов.
Инструменты: xUnit, NUnit, MSTest.
using Xunit;

public class CalculatorTests
{
[Fact]
public void Add_SimpleValues_ReturnsSum()
{
var calculator = new Calculator();
var result = calculator.Add(2, 3);
Assert.Equal(5, result);
}
}

public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}


🟠Интеграционные тесты
Проверяют взаимодействие между различными компонентами системы, убеждаясь, что они корректно работают вместе.
Цель: Проверка взаимодействия между модулями.
Инструменты: xUnit, NUnit, MSTest, плюс дополнительные библиотеки для тестирования баз данных или HTTP-запросов.
using System.Net.Http;
using System.Threading.Tasks;
using Xunit;

public class IntegrationTests
{
private readonly HttpClient _client;

public IntegrationTests()
{
var appFactory = new CustomWebApplicationFactory<Startup>();
_client = appFactory.CreateClient();
}

[Fact]
public async Task Get_EndpointReturnsSuccessAndCorrectContentType()
{
var response = await _client.GetAsync("/api/values");
response.EnsureSuccessStatusCode();
Assert.Equal("application/json; charset=utf-8", response.Content.Headers.ContentType.ToString());
}
}


🟠Функциональные тесты
Проверяют, что приложение выполняет свои функции в соответствии с требованиями. Эти тесты проверяют конкретные сценарии использования.
Цель: Проверка функциональности приложения на уровне пользователя.
Инструменты: Selenium, Playwright, Cypress.
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using Xunit;

public class UiTests
{
[Fact]
public void LoadPage_CheckTitle()
{
using (IWebDriver driver = new ChromeDriver())
{
driver.Navigate().GoToUrl("https://example.com");
Assert.Equal("Example Domain", driver.Title);
}
}
}


🟠Системные тесты
Проверяют приложение в целом, включая взаимодействие с внешними системами и проверку всех требований.
Цель: Проверка всей системы в интегрированном виде.
Инструменты: JUnit, TestNG для Java, или те же инструменты, что и для функциональных тестов.

🟠Приемочные тесты
Проводятся для проверки, что приложение соответствует требованиям и готово к использованию клиентом или конечным пользователем.
Цель: Подтверждение соответствия приложения требованиям.
Инструменты: Cucumber, SpecFlow (для BDD).

🟠Регрессионные тесты
Проверяют, что недавние изменения в коде не нарушили существующую функциональность.
Цель: Убедиться, что новые изменения не привели к новым багам.
Инструменты: Все инструменты для юнит-тестирования и функционального тестирования.

🟠Нагрузочные тесты
Проверяют, как приложение ведет себя под нагрузкой, например, при большом количестве одновременных пользователей или операций.
Цель: Оценка производительности и устойчивости приложения под нагрузкой.
Инструменты: JMeter, Gatling, Apache Bench.

Ставь
👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Что такое сервис локатор?

Сервис локатор в C# — это шаблон проектирования, который используется для обеспечения доступа к сервисам (объектам, предоставляющим определенные функциональности) через централизованный регистр. Этот шаблон позволяет компонентам получать доступ к сервисам без необходимости знать, как и где их создавать или хранить. Сервис локатор может упростить управление зависимостями в больших приложениях, но также может привести к жесткой связанности и затруднениям в управлении зависимостями.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4
🤔 Что такое unsafe?

Используется для объявления небезопасного контекста кода, который позволяет выполнять низкоуровневые операции, такие как манипуляции с указателями. Эти операции обычно не разрешены в безопасном управляемом коде, но могут быть необходимы для взаимодействия с неуправляемым кодом, оптимизации производительности или доступа к определенным системным ресурсам.

🚩Характеристики

🟠Объявление небезопасного контекста
Чтобы использовать указатели и выполнять небезопасные операции, нужно объявить метод, блок кода или тип как unsafe.
unsafe void UnsafeMethod()
{
int a = 10;
int* p = &a; // Использование указателя
Console.WriteLine(*p); // Разыменование указателя
}


🟠Компиляция с поддержкой `unsafe`
Для компиляции кода с unsafe необходимо включить поддержку небезопасного кода в настройках проекта. В Visual Studio это делается через свойства проекта:
1⃣Откройте свойства проекта.
2⃣Перейдите на вкладку "Сборка".
3⃣Установите флажок "Разрешить небезопасный код".

🟠Использование указателей
Указатели позволяют напрямую работать с адресами памяти, что может быть полезно для некоторых оптимизаций или взаимодействия с низкоуровневым кодом, написанным на C или C++.
unsafe void PointerExample()
{
int a = 5;
int* p = &a; // p указывает на адрес переменной a
Console.WriteLine((int)p); // Вывод адреса переменной a
Console.WriteLine(*p); // Вывод значения переменной a через указатель
}


🟠Небезопасные структуры
Вы можете объявлять структуры с указателями и использовать их в небезопасном контексте.
unsafe struct UnsafeStruct
{
public int* Pointer;
}


🟠Стековые указатели (stackalloc)
stackalloc позволяет выделять память в стеке для массива в небезопасном контексте. Это может быть быстрее, чем выделение памяти в куче.
unsafe void StackAllocExample()
{
int* array = stackalloc int[10]; // Выделение массива из 10 целых чисел в стеке
for (int i = 0; i < 10; i++)
{
array[i] = i;
}
}


🟠Взаимодействие с неуправляемым кодом
Небезопасный код часто используется для взаимодействия с API, написанными на других языках, такими как C или C++.
[DllImport("user32.dll")]
extern static unsafe int MessageBox(IntPtr hWnd, char* text, char* caption, int options);

unsafe void CallUnmanagedCode()
{
char* text = "Hello, World!";
char* caption = "My Message Box";
MessageBox(IntPtr.Zero, text, caption, 0);
}


🚩Плюсы

Производительность
Позволяет выполнять высокоэффективные операции с памятью.
Взаимодействие с неуправляемым кодом
Необходим для вызова функций из библиотек, написанных на других языках.
Низкоуровневый контроль
Предоставляет возможность прямого управления памятью и аппаратными ресурсами.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Какая разница между структурой и классом в C#?

В C#, структуры (struct) и классы (class) являются двумя основными средствами для создания сложных типов. Основное различие заключается в типе хранения: структуры — это типы значений, которые хранятся непосредственно в стеке, тогда как классы — это типы ссылок, объекты которых хранятся в управляемой куче. Структуры лучше подходят для небольших данных, которые часто копируются, в то время как классы лучше подходят для больших данных и комплексного поведения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
🤔 Что значит изменить строку?

Может означать создание новой строки с измененным содержимым, поскольку строки являются неизменяемыми (immutable). Это означает, что после создания строковый объект не может быть изменен. Любые операции, которые, казалось бы, изменяют строку, на самом деле создают новую строку.

🚩Способы

🟠Конкатенация строк
Вы можете изменить строку, объединяя её с другой строкой, используя оператор + или метод String.Concat.
string original = "Hello";
string modified = original + " World";
Console.WriteLine(modified); // Output: "Hello World"


🟠Метод `Replace`
Метод Replace позволяет заменить все вхождения указанной подстроки на другую подстроку.
string original = "Hello, World!";
string modified = original.Replace("World", "C#");
Console.WriteLine(modified); // Output: "Hello, C#!"


🟠Метод `Substring`
Метод Substring позволяет извлечь подстроку из строки.
string original = "Hello, World!";
string modified = original.Substring(7, 5); // "World"
Console.WriteLine(modified); // Output: "World"


🟠Метод `Insert`
Метод Insert вставляет подстроку в указанную позицию.
string original = "Hello World";
string modified = original.Insert(5, ",");
Console.WriteLine(modified); // Output: "Hello, World"


🟠Метод `Remove`
Метод Remove удаляет часть строки, начиная с указанного индекса.
string original = "Hello, World!";
string modified = original.Remove(5, 7);
Console.WriteLine(modified); // Output: "Hello!"


🟠Использование `StringBuilder`
Для частых изменений строк предпочтительнее использовать класс StringBuilder, так как он более эффективен в плане производительности для операций, связанных с изменением строк.
using System.Text;

StringBuilder sb = new StringBuilder("Hello");
sb.Append(", World");
sb.Replace("World", "C#");
string modified = sb.ToString();
Console.WriteLine(modified); // Output: "Hello, C#"


🚩Пример изменения строки

Предположим, у нас есть строка, и мы хотим выполнить несколько операций по её изменению: вставить подстроку, заменить часть строки и удалить часть строки.
string original = "The quick brown fox jumps over the lazy dog.";

// Вставка подстроки
string inserted = original.Insert(16, "red ");
// "The quick brown red fox jumps over the lazy dog."

// Замена подстроки
string replaced = inserted.Replace("red", "black");
// "The quick brown black fox jumps over the lazy dog."

// Удаление подстроки
string removed = replaced.Remove(40, 9);
// "The quick brown black fox jumps over the lazy."
Console.WriteLine(removed);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Что такое asp.net?

ASP.NET — это фреймворк для веб-разработки, предоставляемый Microsoft, который позволяет разработчикам строить динамичные веб-сайты, веб-приложения и веб-сервисы. Он основан на .NET Framework и поддерживает языки программирования, такие как C#, VB.NET и другие. ASP.NET отличается от простого HTML тем, что сервер выполняет код и отправляет результаты клиенту, позволяя создавать интерактивные и динамически обновляемые веб-страницы.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥2
🤔 Что такое значимые типы?

Представляют собой типы данных, которые хранят свои значения непосредственно. В отличие от ссылочных типов (reference types), которые хранят ссылки на объекты в памяти, значимые типы хранят данные непосредственно в переменной.

🚩Характеристики

🟠Хранение в стеке
Значимые типы обычно хранятся в стеке, что делает их более эффективными по сравнению с ссылочными типами, которые хранятся в куче.
🟠Копирование значений
При присваивании одной переменной значимого типа другой переменной происходит копирование значения, а не ссылки.
🟠Отсутствие сборщика мусора
Значимые типы не требуют работы сборщика мусора для освобождения памяти, так как они автоматически удаляются при выходе из области видимости.

🚩Примеры

Примитивные типы
int number = 10;
float temperature = 36.6f;
bool isAlive = true;
char letter = 'A';


Структуры
public struct Point
{
public int X;
public int Y;

public Point(int x, int y)
{
X = x;
Y = y;
}
}

Point p1 = new Point(10, 20);
Point p2 = p1; // Копирование значения
p2.X = 30;

Console.WriteLine(p1.X); // Output: 10
Console.WriteLine(p2.X); // Output: 30


Перечисления
public enum DaysOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}

DaysOfWeek today = DaysOfWeek.Monday;


🚩Отличия от ссылочных типов

🟠Хранение в куче
Объекты ссылочных типов хранятся в куче, и на них ссылаются переменные.
🟠 Копирование ссылок
При присваивании одной переменной ссылочного типа другой переменной копируется ссылка на объект, а не сам объект.
🟠Сборка мусора
Сборщик мусора управляет памятью для объектов ссылочных типов, удаляя их, когда на них больше нет ссылок.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
🤔 Что такое индексы, какие типы бывают, использовал ли их на практике?

Индексы в контексте баз данных — это структуры, которые помогают ускорить операции выборки данных, предоставляя быстрые пути к данным в таблицах. Виды индексов включают кластерные, некластерные, полнотекстовые и другие. Кластерные индексы определяют физический порядок хранения данных в таблице, в то время как некластерные индексы хранят только указатели на данные. Я использовал индексы на практике для улучшения производительности запросов в базах данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥4
🤔 Где хранятся ссылочные типы?

Ссылочные типы хранятся в куче (heap), а переменные, которые их ссылаются, хранятся в стеке (stack).

🚩Моменты

🟠Куча (Heap)
Это область памяти, где выделяется память для объектов ссылочных типов. Куча управляется средой выполнения CLR (Common Language Runtime), и сборщик мусора (Garbage Collector) отвечает за освобождение памяти, когда объекты больше не используются.
🟠Стек (Stack)
Это область памяти, где хранятся значения переменных, которые ссылаются на объекты в куче, а также значения переменных значимых типов.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

void Example()
{
Person person1 = new Person { Name = "Alice", Age = 30 };
Person person2 = person1; // person2 ссылается на тот же объект, что и person1
person2.Age = 35;

Console.WriteLine(person1.Age); // Output: 35
Console.WriteLine(person2.Age); // Output: 35
}


🚩Что происходит в памяти

🟠Создание объекта `Person`
Когда выполняется new Person { Name = "Alice", Age = 30 }, новый объект Person создается в куче. В памяти выделяется место для хранения полей Name и Age. Переменная person1 хранится в стеке и содержит ссылку на объект Person в куче.
🟠Присваивание `person2 = person1`
Переменная person2 также хранится в стеке и получает копию ссылки, хранящейся в person1. Оба person1 и person2 теперь указывают на один и тот же объект в куче.
🟠Изменение `person2.Age`
Когда изменяется person2.Age, на самом деле изменяется поле Age объекта Person, на который ссылаются обе переменные.

🚩Сборка мусора (Garbage Collection)

Когда объект в куче больше не имеет активных ссылок из стека или других объектов, сборщик мусора может освободить память, занятую этим объектом. Это помогает управлять памятью и предотвращает утечки памяти.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62
🤔 Что такое EF?

Entity Framework (EF) — это ORM (Object-Relational Mapping) фреймворк от Microsoft, который позволяет разработчикам работать с данными как с объектами, не беспокоясь о базовых SQL запросах. Это упрощает работу с базами данных, автоматически обрабатывая запросы, обновления и связи данных. EF поддерживает широкий спектр функциональности баз данных и облегчает интеграцию данных в .NET-приложения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
🤔 Как при ref & out выделяется память в кучи?

Ключевые слова ref и out используются для передачи аргументов по ссылке, что позволяет методам изменять значения переданных переменных. При этом сами ключевые слова не влияют на то, где выделяется память (в стеке или куче). Место выделения памяти определяется типом данных, который передается в метод.

🚩Основные концепции

🟠`ref`
Передает переменную по ссылке, позволяя методу как читать, так и изменять значение переменной.
void Increment(ref int number)
{
number++;
}

int value = 5;
Increment(ref value);
Console.WriteLine(value); // Output: 6


🟠`out`
Также передает переменную по ссылке, но требует, чтобы метод присвоил значение переменной перед тем, как метод завершится.
void Initialize(out int number)
{
number = 10;
}

int value;
Initialize(out value);
Console.WriteLine(value); // Output: 10


🚩Место выделения памяти

🟠Значимые типы (Value Types)
Переменные значимых типов, такие как int, float, struct, хранятся в стеке. Когда такие переменные передаются в метод с ref или out, передается ссылка на место в стеке, где хранится значение.
void ProcessValue(ref int value)
{
value = 42; // Изменение значения переменной в стеке
}

int x = 10;
ProcessValue(ref x); // Передача ссылки на переменную x в стеке


🟠Ссылочные типы (Reference Types)
Переменные ссылочных типов, такие как объекты классов, хранятся в куче, а ссылки на эти объекты — в стеке. При передаче ссылочных типов с ref или out, передается сама ссылка на объект в куче.
void UpdatePerson(ref Person person)
{
person.Name = "Updated Name"; // Изменение объекта в куче
}

Person person = new Person { Name = "Original Name" };
UpdatePerson(ref person); // Передача ссылки на объект person


Ставь
👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
🤔 В чем разница между асинхронностью и многопоточностью?

Асинхронность и многопоточность — это два подхода к параллельной обработке задач. Асинхронность позволяет программе продолжать выполнение работы, в то время как она ждет завершения другой задачи (например, ввода/вывода), не блокируя основной поток. Многопоточность включает использование нескольких потоков для выполнения различных задач одновременно, что может ускорить выполнение программы за счет одновременной обработки данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥5
🤔 Что такое деревья выражений?

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

🚩Понятия

🟠Определение
Деревья выражений — это структура данных, которая представляет собой синтаксическое дерево выражения. Они позволяют рассматривать и манипулировать кодом как данными.
🟠Пространство имен
Деревья выражений находятся в пространстве имен System.Linq.Expressions.

🚩Зачем нужны?

🟠Динамическое создание кода
Позволяют создавать и компилировать код во время выполнения.
🟠Анализ выражений
Полезны для инструментов анализа кода, таких как ORM (например, Entity Framework), которые преобразуют выражения LINQ в SQL-запросы.
🟠Рефлексия
Помогают в сценариях, где нужно исследовать и манипулировать кодом на уровне метаданных.

Простое арифметическое выражение
using System;
using System.Linq.Expressions;

class Program
{
static void Main()
{
// Создаем параметры для выражения
ParameterExpression paramA = Expression.Parameter(typeof(int), "a");
ParameterExpression paramB = Expression.Parameter(typeof(int), "b");

// Создаем выражение: a + b
BinaryExpression body = Expression.Add(paramA, paramB);

// Компилируем выражение в делегат
var add = Expression.Lambda<Func<int, int, int>>(body, paramA, paramB).Compile();

// Используем делегат
int result = add(2, 3);
Console.WriteLine(result); // Output: 5
}
}


Выражение с логикой
using System;
using System.Linq.Expressions;

class Program
{
static void Main()
{
// Создаем параметры для выражения
ParameterExpression paramX = Expression.Parameter(typeof(int), "x");
ParameterExpression paramY = Expression.Parameter(typeof(int), "y");

// Создаем выражение: x > y ? x - y : y - x
Expression condition = Expression.Condition(
Expression.GreaterThan(paramX, paramY),
Expression.Subtract(paramX, paramY),
Expression.Subtract(paramY, paramX)
);

// Компилируем выражение в делегат
var compareAndSubtract = Expression.Lambda<Func<int, int, int>>(condition, paramX, paramY).Compile();

// Используем делегат
int result1 = compareAndSubtract(10, 5); // Output: 5
int result2 = compareAndSubtract(3, 8); // Output: 5

Console.WriteLine(result1);
Console.WriteLine(result2);
}
}


🚩Использование деревьев выражений

Одним из наиболее распространенных примеров использования деревьев выражений является LINQ. Когда вы пишете выражения LINQ, такие как Queryable.Where, они часто переводятся в деревья выражений, которые затем могут быть преобразованы в SQL-запросы или другие форматы.
using System;
using System.Linq;
using System.Linq.Expressions;

class Program
{
static void Main()
{
Expression<Func<int, bool>> expr = x => x > 5;

// Разбор дерева выражений
var body = (BinaryExpression)expr.Body;
var left = (ParameterExpression)body.Left;
var right = (ConstantExpression)body.Right;

Console.WriteLine($"Left: {left.Name}, Right: {right.Value}"); // Output: Left: x, Right: 5
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 Как используется ключевое слово await?

В C#, ключевое слово `await` используется в сочетании с асинхронными методами для указания точки, в которой выполнение текущего метода будет приостановлено до завершения асинхронной операции. `await` делает код асинхронной операции выглядящим как синхронный и позволяет возвращать управление вызывающему коду, предотвращая блокировку UI или других операций, пока асинхронная операция выполняется.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2