Изменит ли finally значение, уже выбранное для return?
Что выведет код? Нужные using подключены.
👾 — 1
👍 — 2
🥰 — Ничего: finally отменит return
⚡️ — Ошибка компиляции
Ответ: 👾 — 1.
Выражение return value вычисляется до выполнения finally: результатом становится число 1. Затем finally меняет локальную переменную, но уже выбранное возвращаемое значение от этого не меняется.
Правило в документации C#
Библиотека задач по C#
Что выведет код? Нужные 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
⚡️ — Ошибка компиляции
Выражение return value вычисляется до выполнения finally: результатом становится число 1. Затем finally меняет локальную переменную, но уже выбранное возвращаемое значение от этого не меняется.
Библиотека задач по C#
Docs
Statements - C# language specification
This chapter covers statements in C#. Each statement is defined, as are statement blocks, statement reachability, and end points.
👾5❤3
Изменится ли структура после вызова метода через интерфейс?
Что выведет код? Нужные using подключены.
👾 — 1 и 1
👍 — 0 и 0
🥰 — 0 и 1
⚡️ — Ошибка компиляции
Ответ: 🥰 — 0 и 1.
При преобразовании Counter к ICounter происходит упаковка: в объект помещается копия структуры. Increment изменяет эту упакованную копию. Исходная структура сохраняет Value = 0, а при распаковке boxed получаем Value = 1.
Правило в документации C#
Библиотека задач по C#
Что выведет код? Нужные 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
⚡️ — Ошибка компиляции
При преобразовании Counter к ICounter происходит упаковка: в объект помещается копия структуры. Increment изменяет эту упакованную копию. Исходная структура сохраняет Value = 0, а при распаковке boxed получаем Value = 1.
Библиотека задач по C#
Docs
Boxing and Unboxing - C#
Learn about boxing and unboxing in C# programming. See code examples and view other available resources.
🥰2
В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.
Например, можно совместить два направления по работе с ИИ:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.
Акция действует до 31 октября включительно
Please open Telegram to view this post
VIEW IN TELEGRAM
Можно ли записать число в массив строк через переменную object[]?
Что произойдёт при выполнении кода? Нужные using подключены.
👾 — OK — число сохранится как object
👍 — ArrayTypeMismatchException
🥰 — Ошибка компиляции
⚡️ — OK — число превратится в строку
Ответ: 👍 — ArrayTypeMismatchException.
string[] можно присвоить переменной object[] благодаря ковариантности массивов. Но сам массив остаётся массивом строк. Запись int проходит компиляцию, а во время выполнения проверка типа вызывает ArrayTypeMismatchException.
Правило в документации C#
Библиотека задач по C#
Что произойдёт при выполнении кода? Нужные using подключены.
object[] values = new string[1];
values[0] = 42;
Console.WriteLine("OK");
👾 — OK — число сохранится как object
👍 — ArrayTypeMismatchException
🥰 — Ошибка компиляции
⚡️ — OK — число превратится в строку
string[] можно присвоить переменной object[] благодаря ковариантности массивов. Но сам массив остаётся массивом строк. Запись int проходит компиляцию, а во время выполнения проверка типа вызывает ArrayTypeMismatchException.
Библиотека задач по C#
Docs
Arrays - C# language specification
This chapter defines arrays. It includes the rules for array variance, multi-dimensional arrays, and jagged arrays.
👍1
Какую перегрузку выберут для строки в переменной object?
Что выведет код? Нужные using подключены.
👾 — stringstring
👍 — objectobject
🥰 — Ошибка компиляции
⚡️ — objectstring
Ответ: ⚡️ — objectstring.
В первом вызове тип аргумента при компиляции — object, поэтому выбирается Show(object). После явного приведения аргумент имеет тип string и выбирается Show(string). Здесь нет dynamic, и фактическое содержимое переменной не переключает перегрузку.
Правило в документации C#
Библиотека задач по C#
Что выведет код? Нужные 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
В первом вызове тип аргумента при компиляции — object, поэтому выбирается Show(object). После явного приведения аргумент имеет тип string и выбирается Show(string). Здесь нет dynamic, и фактическое содержимое переменной не переключает перегрузку.
Библиотека задач по C#
Docs
Expressions - C# language specification
This chapter covers operators and expressions. Expressions form several groups, including primary expressions, unary operators, arithmetic operators, relational and type testing operators, and logical operators.
⚡1
Что получится, если соединить null и bool?
C# 12. Что выведет код?
👾 — False True
👍 — null null
🥰 — False False
⚡️ — Ошибка компиляции
Ответ: 👾 — False True.
Для bool? работают три значения: true, false и null. У выражения value & false результат всегда false. У value | true — всегда true. Неизвестное значение второго операнда этому не мешает.
Документация: логические операторы для bool?
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C# 12. Что выведет код?
using System;
bool? value = null;
Console.WriteLine($"{value & false} {value | true}");
👾 — False True
👍 — null null
🥰 — False False
⚡️ — Ошибка компиляции
Для bool? работают три значения: true, false и null. У выражения value & false результат всегда false. У value | true — всегда true. Неизвестное значение второго операнда этому не мешает.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Boolean logical operators - the boolean and, or, not, and xor operators - C# reference
C# logical operators perform logical negation (`!`), conjunction (AND - `&`, `&&`), and inclusive and exclusive disjunction (OR - `|`, `||`, `^`) operations with Boolean operands.
👾1
Что выполнится раньше: фильтр catch или finally?
C# 12. Что выведет код?
👾 — FQC
👍 — QFC
🥰 — QCF
⚡️ — FCQ
Ответ: 👍 — QFC.
Сначала среда ищет подходящий обработчик и проверяет фильтр — печатается Q. Затем выполняет finally при выходе из вложенного блока — F. После этого управление попадает в catch — C.
Документация: фильтры исключений
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
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
Сначала среда ищет подходящий обработчик и проверяет фильтр — печатается Q. Затем выполняет finally при выходе из вложенного блока — F. После этого управление попадает в catch — C.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Exception-handling statements - throw and try, catch, finally - C# reference
Use the C# throw statement to signal an occurrence of an exception. Use the C# try statements to catch and process exceptions occurred in a block of code.
🥰1👾1
Равны ли кортежи с разными именами полей?
C# 12. Что выведет код?
👾 — Ошибка компиляции
👍 — False
🥰 — True
⚡️ — Исключение при сравнении
Ответ: 🥰 — True.
Оператор == сравнивает соответствующие элементы кортежей. Имена полей в сравнении не участвуют: здесь сравниваются 1 с 1 и 2 с 2.
Документация: равенство кортежей
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C# 12. Что выведет код?
using System;
var first = (X: 1, Y: 2);
var second = (A: 1, B: 2);
Console.WriteLine(first == second);
👾 — Ошибка компиляции
👍 — False
🥰 — True
⚡️ — Исключение при сравнении
Оператор == сравнивает соответствующие элементы кортежей. Имена полей в сравнении не участвуют: здесь сравниваются 1 с 1 и 2 с 2.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Tuple types - C# reference
C# tuples: lightweight data structures that you can use to group loosely related data elements. Tuples introduce a type that contains multiple public members.
🥰2
Что попадёт в params, если передать null?
C# 12, проверка nullable отключена. Что выведет код?
👾 — 1 1
👍 — 0 1
🥰 — null null
⚡️ — null 1
Ответ: ⚡️ — null 1.
В первом вызове null передаётся как сам массив. Во втором приведение к object заставляет передать один элемент: компилятор создаёт массив длины 1, который содержит null.
Документация: параметры params
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
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 передаётся как сам массив. Во втором приведение к object заставляет передать один элемент: компилятор создаёт массив длины 1, который содержит null.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Method parameters and modifiers - C# reference
Parameter modifiers enable pass-by-reference semantics, with distinctions for read-only, and `out` parameters. The `params` modifier allows optional arguments.
⚡4
В каком порядке выполнится код с await?
C# 12. Что выведет код?
👾 — ABC
👍 — BAC
🥰 — ACB
⚡️ — Порядок каждый раз разный
Ответ: 👾 — ABC.
Вызов Work() сразу печатает A. На незавершённой задаче выполнение метода приостанавливается, и вызывающий код печатает B. Только после SetResult метод может продолжить работу и вывести C.
Документация: выполнение асинхронного метода
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
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
⚡️ — Порядок каждый раз разный
Вызов Work() сразу печатает A. На незавершённой задаче выполнение метода приостанавливается, и вызывающий код печатает B. Только после SetResult метод может продолжить работу и вывести C.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Asynchronous programming - C#
Explore an overview of the C# language support for asynchronous programming by using async, await, Task, and Task.
Получит ли класс готовый метод из интерфейса?
C# 12. Скомпилируется ли программа?
👾 — Да, выведет I
👍 — Нет, у Item нет доступного метода Show
🥰 — Да, но ничего не выведет
⚡️ — Да, но при вызове будет исключение
Ответ: 👍 — Нет, у Item нет доступного метода Show.
Реализация метода в интерфейсе не добавляет этот метод в класс. Вызвать её можно через переменную интерфейсного типа: IShow item = new Item(); item.Show();. Такой код выведет I.
Документация: реализация методов в интерфейсах
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
C# 12. Скомпилируется ли программа?
using System;
var item = new Item();
item.Show();
interface IShow
{
void Show() => Console.Write("I");
}
class Item : IShow { }
👾 — Да, выведет I
👍 — Нет, у Item нет доступного метода Show
🥰 — Да, но ничего не выведет
⚡️ — Да, но при вызове будет исключение
Реализация метода в интерфейсе не добавляет этот метод в класс. Вызвать её можно через переменную интерфейсного типа: IShow item = new Item(); item.Show();. Такой код выведет I.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
interface keyword - C# reference
Use the `interface` keyword to define contracts that any implementing type must support. Interfaces provide the means to create common behavior among a set of unrelated types.
👍1👾1
Какая переменная изменит элемент массива?
C# 12. Что выведет код?
👾 — 1 7
👍 — 7 7
🥰 — 9 7
⚡️ — 9 9
Ответ: 🥰 — 9 7.
Обычное присваивание сохраняет в copy отдельное число. Переменная alias объявлена с ref и ссылается на элемент массива. Запись в неё меняет values[0].
Документация: возврат по ссылке
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
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
Обычное присваивание сохраняет в copy отдельное число. Переменная alias объявлена с ref и ссылается на элемент массива. Запись в неё меняет values[0].
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Jump statements - break, continue, return, and goto - C# reference
C# jump statements (break, continue, return, and goto) unconditionally transfer control from the current location to a different statement.
Могут ли две проверки на null дать разные ответы?
C# 12, проверка nullable отключена. Что выведет код?
👾 — False False
👍 — True True
🥰 — Ошибка компиляции
⚡️ — True False
Ответ: ⚡️ — True False.
Выражение value == null вызывает наш оператор, который всегда возвращает true. Проверка value is null перегруженный оператор не вызывает. Объект существует, поэтому её результат — false.
Документация: проверка is 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
Выражение value == null вызывает наш оператор, который всегда возвращает true. Проверка value is null перегруженный оператор не вызывает. Объект существует, поэтому её результат — false.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
The `is` operator - Match an expression against a type or constant pattern - C# reference
Learn about the C# `is` operator that matches an expression against a pattern. The `is` operator returns true when the expression matches the pattern.
❤1
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
Ordinal учитывает регистр, поэтому все три строки различаются. OrdinalIgnoreCase считает их одинаковыми, и в этом множестве остаётся один элемент.
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Сначала выполняется тело блока и печатается X. При выходе ресурсы освобождаются в обратном порядке объявления: second печатает B, затем first — A.
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Если получатель равен null, оператор ?[] возвращает null и пропускает вычисление индекса. Next не вызывается, поэтому calls остаётся равным нулю.
Please open Telegram to view this post
VIEW IN TELEGRAM