Библиотека задач по C# | тесты, код, задания
4.88K subscribers
485 photos
5 videos
692 links
Задачи и тесты по C# для тренировки и обучения.

Учиться у нас: https://clc.to/3e1SCw

По рекламе: @tproger_sales_bot

Для обратной связи: @proglibrary_feeedback_bot

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Что попадёт в результат LINQ после изменения списка?

Что выведет код? Нужные using подключены.

var numbers = new List<int> { 1, 2, 3 };
var selected = numbers.Where(n => n > 1);
numbers.Add(4);

Console.WriteLine(string.Join(", ", selected));


👾 — 2, 3 — запрос запомнил исходный список
👍 — 2, 3, 4 — список читается при переборе
🥰 — 4 — запрос видит только новые элементы
⚡️ — InvalidOperationException

Ответ: 👍 — 2, 3, 4 — список читается при переборе.

Where выполняет отбор при переборе. Добавление произошло до начала перебора в string.Join, поэтому в результат попадёт и 4.

Правило в документации C#

Библиотека задач по C#
👍9👾2
😎 Выбираешь один курс, второй получаешь бесплатно. Баг? Нет, акция!

До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один.

Например, можно совместить:

💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.

💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.


Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽ 🔥

Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога.

Акция действует до 31 октября включительно ⏳

⏬ Собрать свой учебный билд
Please open Telegram to view this post
VIEW IN TELEGRAM
Какие числа напечатают действия, созданные в цикле for?

Что выведет код? Нужные using подключены.

var actions = new List<Action>();

for (int i = 0; i < 3; i++)
{
actions.Add(() => Console.Write(i));
}

foreach (var action in actions)
action();


👾 — 012
👍 — Ошибка компиляции
🥰 — 123
⚡️ — 333

Ответ: ⚡️ — 333.

Все три лямбды захватывают одну переменную i из for. Действия выполняются после завершения цикла, когда i равна 3. Это отличается от захвата переменной foreach в современных версиях C#.

Правило в документации C#

Библиотека задач по C#
⚡1
Изменит ли finally значение, уже выбранное для return?

Что выведет код? Нужные using подключены.

class Program
{
static int GetValue()
{
int value = 1;
try { return value; }
finally { value = 2; }
}

static void Main()
{
Console.WriteLine(GetValue());
}
}


👾 — 1
👍 — 2
🥰 — Ничего: finally отменит return
⚡️ — Ошибка компиляции

Ответ: 👾 — 1.

Выражение return value вычисляется до выполнения finally: результатом становится число 1. Затем finally меняет локальную переменную, но уже выбранное возвращаемое значение от этого не меняется.

Правило в документации C#

Библиотека задач по C#
👾5❤3
Изменится ли структура после вызова метода через интерфейс?

Что выведет код? Нужные using подключены.

interface ICounter { void Increment(); }

struct Counter : ICounter
{
public int Value;
public void Increment() { Value++; }
}

class Program
{
static void Main()
{
Counter original = new Counter();
ICounter boxed = original;
boxed.Increment();

Console.WriteLine(original.Value);
Console.WriteLine(((Counter)boxed).Value);
}
}


👾 — 1 и 1
👍 — 0 и 0
🥰 — 0 и 1
⚡️ — Ошибка компиляции

Ответ: 🥰 — 0 и 1.

При преобразовании Counter к ICounter происходит упаковка: в объект помещается копия структуры. Increment изменяет эту упакованную копию. Исходная структура сохраняет Value = 0, а при распаковке boxed получаем Value = 1.

Правило в документации C#

Библиотека задач по C#
🥰2
📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше.

В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.

Например, можно совместить два направления по работе с ИИ:

💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.

💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.


📍 Разница в цене — почти 50 тысяч рублей. Можно освоить больше, не выходя за рамки запланированного бюджета.

А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.

Акция действует до 31 октября включительно ⏳

⏮️ Пора прокачать свой стек
Please open Telegram to view this post
VIEW IN TELEGRAM
Можно ли записать число в массив строк через переменную object[]?

Что произойдёт при выполнении кода? Нужные using подключены.

object[] values = new string[1];
values[0] = 42;

Console.WriteLine("OK");


👾 — OK — число сохранится как object
👍 — ArrayTypeMismatchException
🥰 — Ошибка компиляции
⚡️ — OK — число превратится в строку

Ответ: 👍 — ArrayTypeMismatchException.

string[] можно присвоить переменной object[] благодаря ковариантности массивов. Но сам массив остаётся массивом строк. Запись int проходит компиляцию, а во время выполнения проверка типа вызывает ArrayTypeMismatchException.

Правило в документации C#

Библиотека задач по C#
👍1
Какую перегрузку выберут для строки в переменной object?

Что выведет код? Нужные using подключены.

class Program
{
static void Show(object value)
{
Console.Write("object");
}

static void Show(string value)
{
Console.Write("string");
}

static void Main()
{
object value = "hello";
Show(value);
Show((string)value);
}
}


👾 — stringstring
👍 — objectobject
🥰 — Ошибка компиляции
⚡️ — objectstring

Ответ: ⚡️ — objectstring.

В первом вызове тип аргумента при компиляции — object, поэтому выбирается Show(object). После явного приведения аргумент имеет тип string и выбирается Show(string). Здесь нет dynamic, и фактическое содержимое переменной не переключает перегрузку.

Правило в документации C#

Библиотека задач по C#
⚡1
Что получится, если соединить null и bool?

C# 12. Что выведет код?

using System;

bool? value = null;

Console.WriteLine($"{value & false} {value | true}");


👾 — False True
👍 — null null
🥰 — False False
⚡️ — Ошибка компиляции

Ответ: 👾 — False True.

Для bool? работают три значения: true, false и null. У выражения value & false результат всегда false. У value | true — всегда true. Неизвестное значение второго операнда этому не мешает.

Документация: логические операторы для bool?

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👾1
Что выполнится раньше: фильтр catch или finally?

C# 12. Что выведет код?

using System;

try
{
try { throw new Exception(); }
finally { Console.Write("F"); }
}
catch (Exception) when (Check())
{
Console.Write("C");
}

static bool Check()
{
Console.Write("Q");
return true;
}


👾 — FQC
👍 — QFC
🥰 — QCF
⚡️ — FCQ

Ответ: 👍 — QFC.

Сначала среда ищет подходящий обработчик и проверяет фильтр — печатается Q. Затем выполняет finally при выходе из вложенного блока — F. После этого управление попадает в catch — C.

Документация: фильтры исключений

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰1👾1
Равны ли кортежи с разными именами полей?

C# 12. Что выведет код?

using System;

var first = (X: 1, Y: 2);
var second = (A: 1, B: 2);

Console.WriteLine(first == second);


👾 — Ошибка компиляции
👍 — False
🥰 — True
⚡️ — Исключение при сравнении

Ответ: 🥰 — True.

Оператор == сравнивает соответствующие элементы кортежей. Имена полей в сравнении не участвуют: здесь сравниваются 1 с 1 и 2 с 2.

Документация: равенство кортежей

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰2
Что попадёт в params, если передать null?

C# 12, проверка nullable отключена. Что выведет код?

using System;

Show(null);
Show((object)null);

static void Show(params object[] items)
{
Console.Write(
items is null ? "null " : items.Length + " "
);
}


👾 — 1 1
👍 — 0 1
🥰 — null null
⚡️ — null 1

Ответ: ⚡️ — null 1.

В первом вызове null передаётся как сам массив. Во втором приведение к object заставляет передать один элемент: компилятор создаёт массив длины 1, который содержит null.

Документация: параметры params

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡4
В каком порядке выполнится код с await?

C# 12. Что выведет код?

using System;
using System.Threading.Tasks;

var gate = new TaskCompletionSource<bool>();

async Task Work()
{
Console.Write("A");
await gate.Task;
Console.Write("C");
}

var task = Work();
Console.Write("B");
gate.SetResult(true);
await task;


👾 — ABC
👍 — BAC
🥰 — ACB
⚡️ — Порядок каждый раз разный

Ответ: 👾 — ABC.

Вызов Work() сразу печатает A. На незавершённой задаче выполнение метода приостанавливается, и вызывающий код печатает B. Только после SetResult метод может продолжить работу и вывести C.

Документация: выполнение асинхронного метода

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Получит ли класс готовый метод из интерфейса?

C# 12. Скомпилируется ли программа?

using System;

var item = new Item();
item.Show();

interface IShow
{
void Show() => Console.Write("I");
}

class Item : IShow { }


👾 — Да, выведет I
👍 — Нет, у Item нет доступного метода Show
🥰 — Да, но ничего не выведет
⚡️ — Да, но при вызове будет исключение

Ответ: 👍 — Нет, у Item нет доступного метода Show.

Реализация метода в интерфейсе не добавляет этот метод в класс. Вызвать её можно через переменную интерфейсного типа: IShow item = new Item(); item.Show();. Такой код выведет I.

Документация: реализация методов в интерфейсах

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👾1
Какая переменная изменит элемент массива?

C# 12. Что выведет код?

using System;

int[] values = { 1, 2 };

int copy = First(values);
ref int alias = ref First(values);

copy = 7;
alias = 9;

Console.WriteLine($"{values[0]} {copy}");

static ref int First(int[] items)
=> ref items[0];


👾 — 1 7
👍 — 7 7
🥰 — 9 7
⚡️ — 9 9

Ответ: 🥰 — 9 7.

Обычное присваивание сохраняет в copy отдельное число. Переменная alias объявлена с ref и ссылается на элемент массива. Запись в неё меняет values[0].

Документация: возврат по ссылке

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Могут ли две проверки на null дать разные ответы?

C# 12, проверка nullable отключена. Что выведет код?

using System;

var value = new Item();

Console.WriteLine(
$"{value == null} {value is null}"
);

class Item
{
public static bool operator ==(Item a, Item b)
=> true;

public static bool operator !=(Item a, Item b)
=> false;

public override bool Equals(object other)
=> ReferenceEquals(this, other);

public override int GetHashCode() => 0;
}


👾 — False False
👍 — True True
🥰 — Ошибка компиляции
⚡️ — True False

Ответ: ⚡️ — True False.

Выражение value == null вызывает наш оператор, который всегда возвращает true. Проверка value is null перегруженный оператор не вызывает. Объект существует, поэтому её результат — false.

Документация: проверка is null

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
👀 Сколько строк останется в HashSet с разными правилами сравнения?

C# 12 / .NET 8. Что выведет код?

using System;
using System.Collections.Generic;

var words = new[] { "Go", "GO", "go" };
var exact = new HashSet<string>(words, StringComparer.Ordinal);
var ignore = new HashSet<string>(words, StringComparer.OrdinalIgnoreCase);

Console.WriteLine($"{exact.Count} {ignore.Count}");


👾 — 3 1
👍 — 3 3
🥰 — 1 1
⚡️ — 1 3

Ответ: 👾 — 3 1.

Ordinal учитывает регистр, поэтому все три строки различаются. OrdinalIgnoreCase считает их одинаковыми, и в этом множестве остаётся один элемент.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 В каком порядке закроются два ресурса с using var?

C# 12 / .NET 8. Что выведет код?

using System;

{
using var first = new Resource("A");
using var second = new Resource("B");
Console.Write("X");
}

sealed class Resource(string name) : IDisposable
{
public void Dispose() => Console.Write(name);
}


👾 — ABX
👍 — XAB
🥰 — XBA
⚡️ — BAX

Ответ: 🥰 — XBA.

Сначала выполняется тело блока и печатается X. При выходе ресурсы освобождаются в обратном порядке объявления: second печатает B, затем first — A.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Вызовется ли функция индекса внутри ?[], если массив равен null?

C# 12 / .NET 8. Что выведет код?

using System;

int calls = 0;
int[] values = null;
int? value = values?[Next()];

Console.WriteLine($"{calls} {value is null}");

int Next()
{
calls++;
return 0;
}


👾 — 1 True
👍 — 0 True
🥰 — 0 False
⚡️ — NullReferenceException

Ответ: 👍 — 0 True.

Если получатель равен null, оператор ?[] возвращает null и пропускает вычисление индекса. Next не вызывается, поэтому calls остаётся равным нулю.

Документация

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM