Библиотека задач по 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
Можно ли записать число в массив строк через переменную 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