Лекция Тесты
C# (C Sharp) — это объектно-ориентированный язык высокого уровня программирования от компании Microsoft, разработанный для платформы .NET. Разработан в 1998—2001 годах группой инженеров компании Microsoft под руководством Андерса Хейлсберга и Скотта Вильтаумота[
Используется для:
Особенности языка C# :
В отличие от:
Сравнение с другими языками Javascript, C++, C, PHP

using System;
class Program
{
static void Main()
{
Console.WriteLine("Hello, World!");
}
}
3.1 Переменная — это именованная область памяти, в которой хранится значение определенного типа.
int a = 10; // целое число double b = 3.14; // дробное bool isTrue = true; // логический тип string text = "Hi"; // строка
var x = 5; // компилятор сам определит тип (int)
3.2 В C# есть два основных типа хранения (Stack vs Heap):
int, double, struct)int a = 5; // хранится в стеке
class)var obj = new MyClass(); // объект в куче
int a = 5; int b = a; // копия MyClass o1 = new MyClass(); MyClass o2 = o1; // ссылка
void Foo(int x) { x = 100; }
Изменения не влияют на оригинал
ref, out, invoid Update(ref int x) { x = 50; } int a = 10; Update(ref a); // a = 50
Требования:
void GetValue(out int x) { x = 42; } int result; GetValue(out result);
Особенности:
void Print(in int x) { Console.WriteLine(x); }
| Модификатор | Чтение | Запись | Требует инициализации |
|---|---|---|---|
| value | да | да | да |
| ref | да | да | да |
| out | нет | да | нет |
| in | да | нет | да |
struct Point { public int X; }
class User { public string Name; }
В .NET есть автоматический сборщик мусора.
var obj = new MyClass(); obj = null; // объект больше не используется
GC позже удалит его из памяти (не сразу) , не будет особождение памяти при выходе из метода,при obj = null,сразу после удаления ссылки
а будет
| Поколение | Что хранит |
|---|---|
| Gen 0 | новые объекты |
| Gen 1 | пережили 1 сборку |
| Gen 2 | долгоживущие |
Когда Gen 0 переполнен - быстрый GC
Когда Gen 2 - тяжелая полная сборка
— работа с памятью без аллокаций
— это современный инструмент для работы с памятью без копирования.
numbers = stackalloc int[3] {1, 2, 3};
Особенности:
Ограничения:
ReadOnlySpan
ReadOnlySpan<char> text = "Hello";
Span<int> data = stackalloc int[10];
| Ситуация | Использовать |
|---|---|
| Маленькие данные | value type |
| Большие объекты | class |
| Нужно изменить аргумент | ref |
| Нужно вернуть несколько значений | out |
| Только чтение без копии | in |
| Высокая производительность | Span |
Копирование больших struct
Неправильное использование ref/out
Утечки памяти через ссылки
Попытка сохранить Span в поле класса
Переменные в C# — это не просто «контейнеры», а механизм управления памятью:

В C# типы данных можно разделить на несколько групп.
byte //беззнаковый 8‑битный тип Диапазон:0…255short // знаковый 16‑битный тип Диапазон: -32,768 … 32,767 int // int — знаковый 32‑битный тип Диапазон: -2,147,483,648 … 2,147,483,647 long // знаковый 64‑битный тип Диапазон: -9,223,372,036,854,775,808 …9,223,372,036,854,775,807
Пример:
int age = 25; long population = 8000000000;
float // менее точный double // стандартный дробный тип decimal // точный, часто для денег
Пример:
double price = 10.5; float price = 10.5f; decimal money = 99.99m;
m у decimal обязательно:
decimal salary = 1200.50m;
bool isActive = true; bool isDeleted = false;
char letter = 'A'; string name = "Ivan";
Важно:
char // один символ, одинарные кавычки string // текст, двойные кавычки
DateTime now = DateTime.Now; DateTime birthday = new DateTime(2000, 5, 10);
int[] numbers = { 1, 2, 3 }; string[] names = { "Ivan", "Olga" };
List<string> users = new List<string>(); Dictionary<string, int> ages = new Dictionary<string, int>();
class User { public string Name { get; set; } public int Age { get; set; } } User user = new User();
Обычный int не может быть null:
int age = null; // ошибка
Но можно так:
int? age = null; DateTime? deletedAt = null;
object может хранить значение любого типа:
object value = 123; object text = "Hello";
Но лучше использовать конкретные типы, а не object.
int[] numbers = {1, 2, 3, 4};
Console.WriteLine(numbers ); // 1
Перебор:
foreach (var n in numbers)
{
Console.WriteLine(n);
}
Делегаты — да, это отдельный тип.
В C# delegate — это ссылочный тип, который хранит ссылку на метод.
public delegate void MyHandler(string message);
Пример:
void Print(string text) { Console.WriteLine(text); } MyHandler handler = Print; handler("Hello");
События — это не отдельный тип данных.
event — это специальный член класса, который основан на делегате.
public event MyHandler SomethingHappened;
То есть:
event = механизм подписки на delegate
Коротко:
| Конструкция | Это тип? | Что это |
|---|---|---|
delegate |
да | ссылочный тип для хранения метода |
event |
нет | член класса, оболочка над делегатом |
Action |
да | готовый delegate без возвращаемого значения |
Func |
да | готовый delegate с возвращаемым значением |
Пример современного варианта:
public event Action<string> MessageReceived;
Здесь Action — это делегат, а MessageReceived — событие.
Tuple и ValueTuple) В C# кортежи (Tuple и более современный ValueTuple) позволяют хранить несколько значений разных типов в одной структуре. Пример простого использования:
using System;
class Program
{
static void Main()
{
// Создание кортежа с двумя элементами
(string Name, int Age) person = ("Иван", 30);
Console.WriteLine($"Имя: {person.Name}, Возраст: {person.Age}");
// Кортеж с тремя элементами
var point = (X: 10, Y: 20, Z: 30);
Console.WriteLine($"Точка: ({point.X}, {point.Y}, {point.Z})");
// Возврат кортежа из метода
var result = GetMinMax(new int[] { 5, 2, 9, 1 });
Console.WriteLine($"Min: {result.min}, Max: {result.max}");
}
static (int min, int max) GetMinMax(int[] numbers)
{
int min = int.MaxValue;
int max = int.MinValue;
foreach (var n in numbers)
{
if (n < min) min = n;
if (n > max) max = n;
}
return (min, max);
}
}
(string Name, int Age) — объявление именованных элементов кортежа.
Можно использовать var для автоматического вывода типов.
Кортежи удобны для возврата нескольких значений из метода без создания отдельного класса.

Короткая таблица типов данных в Си шарпе
| Тип | Для чего |
|---|---|
int |
целые числа |
long |
большие целые числа |
double |
дробные числа |
decimal |
деньги, точные расчеты |
bool |
true / false |
char |
один символ |
string |
текст |
DateTime |
дата и время |
int[] |
массив чисел |
List |
список |
Dictionary |
ключ-значение |
object |
любой тип |
int? |
nullable-число |
| Категория | Тип | Это тип? | Описание |
|---|---|---|---|
| Значимые (Value Types) | int, double, bool, char |
+ | Хранят значение напрямую |
struct |
+ | Пользовательские значимые типы | |
enum |
+ | Набор констант | |
Nullable (int?) |
+ | Значимый тип с null |
|
| Ссылочные (Reference Types) | class |
+ | Основной ООП тип |
string |
+ | Строка (особый ссылочный тип) | |
array |
+ | Массив | |
object |
+ | Базовый тип для всех | |
interface |
+ | Контракт | |
List, Dictionary<,> |
+ | Коллекции | |
| Делегаты и события | delegate |
+ | Ссылочный тип (указатель на метод) |
Action, Func |
+ | Готовые делегаты | |
event |
нет | Обертка над делегатом (не тип) |
Переменные и классы одного типа можно превращать в сущности других типов с помощью кастинга, боксинга и анбоксинга
Кастинг в C# — это просто преобразование одного типа в другой (явное или неявное), тогда как боксинг и анбоксинг связаны именно с переходом между value types и reference types. Боксинг упаковывает значение в объект на куче, анбоксинг извлекает его обратно.
Основные различия преобразований типов
| Механизм | Что делает | Пример | Особенности |
|---|---|---|---|
| Casting (кастинг) |
Преобразует значение одного типа в другой (в пределах совместимых типов). |
double d = 3.14; int i = (int)d; |
Может быть явным ((int)) или неявным (например, int → double). Не создает объект в куче. |
| Boxing (боксинг) |
Упаковывает value type (например, int) в объект (System.Object или интерфейс). |
int i = 5; object o = i; |
Неявный процесс. CLR копирует значение со стека в кучу и возвращает ссылку. |
| Unboxing (анбоксинг) |
Извлекает значение из объекта обратно в value type. |
object o = 5; int i = (int)o; |
Явный процесс. Требует правильного типа, иначе InvalidCastException. |
Ключевые моменты
int a = 5, b = 3; Console.WriteLine(a + b); // 8 Console.WriteLine(a - b); // 2 Console.WriteLine(a * b); // 15 Console.WriteLine(a / b); // 1 (целочисленное!)
if (a > b && b > 0)
{
Console.WriteLine("OK");
}
int x = 10;
if (x > 5)
{
Console.WriteLine("Больше 5");
}
else
{
Console.WriteLine("Меньше или равно 5");
}
int day = 1;
switch (day)
{
case 1:
Console.WriteLine("Понедельник");
break;
case 2:
Console.WriteLine("Вторник");
break;
default:
Console.WriteLine("Другой день");
break;
}
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
int i = 0;
while (i < 5)
{
Console.WriteLine(i);
i++;
}
В foreach обычно нельзя менять саму переменную цикла:
int[] numbers = { 1, 2, 3, 4, 5 }; foreach (int number in numbers) { Console.WriteLine(number); }
тоже самое с использованием var , var означает: C# сам определит тип переменной. В этом случае number будет int.
foreach (var number in numbers) { Console.WriteLine(number); }
Пример foreach со List
List<string> users = new List<string> { "Ivan", "Olga", "Maria" }; foreach (var user in users) { Console.WriteLine(user); }
Пример foreach с Dictionary в C#:
Dictionary<string, int> ages = new Dictionary<string, int> { { "Ivan", 25 }, { "Olga", 30 }, { "Maria", 22 } }; foreach (var item in ages) { Console.WriteLine(item.Key + " = " + item.Value); }
Вывод:
Ivan = 25 Olga = 30 Maria = 22
static int Sum(int a, int b)
{
return a + b;
}
Использование:
int result = Sum(2, 3);
class Person
{
public string Name;
public int Age;
public void SayHello()
{
Console.WriteLine("Привет, я " + Name);
}
}
Использование:
Person p = new Person(); // создание, инстацирование p.Name = "Иван"; //присваивание p.Age = 30; //присваивание
Console.WriteLine("Привет, я " + p.Name );//получение
p.SayHello();// вызов метода
public class Person
{
// Приватное поле — скрыто от внешнего кода
private string _name;
// Публичное свойство с логикой проверки
public string Name
{
get { return _name; }
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentException("Имя не может быть пустым");
_name = value;
}
}
// Конструктор задает начальное состояние
public Person(string name)
{
Name = name; // Используем свойство, а не напрямую поле
}
// Дополнительный метод — инкапсулирует поведение
public void Rename(string newName)
{
Name = newName;
}
}
class Animal
{
public void Speak()
{
Console.WriteLine("Звук");
}
}
class Dog : Animal
{
name = "Dog";
}
class Animal
{
public virtual void Speak()
{
Console.WriteLine("Звук");
}
}
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Гав");
}
}
try
{
int x = int.Parse("abc");
}
catch (Exception e)
{
Console.WriteLine("Ошибка: " + e.Message);
}
В языке C# управление памятью обычно берет на себя Garbage Collector (GC). Однако, если ваш код использует системные ресурсы (файлы, соединения с БД, сетевые сокеты), GC может не освободить их достаточно оперативно.
Для решения этой проблемы существует интерфейс IDisposable с единственным методом Dispose(). Оператор using — это «синтаксический сахар», который гарантирует, что этот метод будет вызван автоматически.
Зачем это нужно?
Представьте, что вы открыли файл для записи. Если программа «упадет» из-за ошибки до того, как вы закроете файл, он может остаться заблокированным операционной системой.
using создает блок try-finally, где вызов Dispose() происходит в секции finally. Это гарантирует освобождение ресурса даже при возникновении исключения.
Способы использования
Этот вариант четко ограничивает область видимости переменной фигурными скобками. Как только выполнение выходит за скобки, ресурс освобождается.
using (var stream = new FileStream("test.txt", FileMode.Create))
{
// Работаем с файлом
} // Здесь автоматически вызывается stream.Dispose()
Более современный и лаконичный способ. Вам не нужны фигурные скобки — ресурс будет освобожден в конце текущего метода или блока кода.
void WriteData()
{
using var stream = new FileStream("test.txt", FileMode.Create);
// Работаем с файлом
// Dispose() вызовется автоматически при выходе из метода
}
Как это работает "под капотом"
Компилятор разворачивает конструкцию using в конструкцию try-finally.
Пример логики компилятора:
{
var resource = new MyResource();
try
{
// Использование ресурса
}
finally
{
if (resource != null)
((IDisposable)resource).Dispose();
}
}
Когда использовать?
Правило простое: Если класс реализует IDisposable, почти всегда его нужно оборачивать в using.
Распространенные примеры:
Работа с файлами: StreamReader, StreamWriter, FileStream.
Сеть: HttpClient (хотя с ним есть нюансы по повторному использованию), TcpClient.
Базы данных: SqlConnection, DbContext в Entity Framework.
Графика: Bitmap, Pen, Brush.
Дженерики (Generics) в C# — это способ писать универсальный код, который работает с разными типами данных, без потери типизации.
Простое определение
Дженерик — это шаблон типа, где конкретный тип подставляется позже.
Пример без дженериков (плохо)
class Box
{
public object Value;
}
Проблемы:
Box box = new Box(); box.Value = 123; int x = (int)box.Value; // каст
С дженериками (правильно)
Использование:
Никаких кастов, все строго типизировано
Где используются дженерики
— это список, который может хранить только int. Попытка добавить строку вызовет ошибку компиляции.
— словарь, где ключи строго string, а значения строго int. Это гарантирует типобезопасность.
List
Использование:
int x = GetFirst(new int[] {1, 2, 3});
string s = GetFirst(new string[] {"a", "b"});
Можно указать, какие типы разрешены:
Примеры:
where T : class // только ссылочные типы where T : struct // только значимые where T : new() // должен быть конструктор
В чем сила дженериков
| Без generics | С generics |
|---|---|
| object | конкретный тип |
| касты | без кастов |
| ошибки в runtime | ошибки на этапе компиляции |
| медленнее | быстрее |
Ключевая идея
Дженерики = тип передается как параметр
Тут T — это “любой тип”
Итог
Сравнение с Java generics
Generics в CLR реализованы не как «сахар компилятора», а как фундаментальная часть самой виртуальной машины: они существуют на уровне IL и метаданных, а JIT‑компилятор выполняет реальное специализированное развертывание для value‑types и код‑sharing для reference‑types. Это делает generics в .NET гораздо более мощными и эффективными, чем, например, в Java, где они реализованы через стирание типов.
| Характеристика | CLR (.NET) generics | Java generics |
|---|---|---|
| Реализация | Встроены в IL и CLR | Type erasure (стирание типов) |
| Производительность | Почти как у ручного кода | Иногда требует боксовки |
| Рефлексия | Полная информация о типах | Ограничена (тип стирается) |
| Value types | Специализация без боксовки | Нет поддержки (только объекты) |
| Code sharing | Для ссылочных типов | Нет (каждый generic стирается до Object) |
Extension method в C# — это статический метод, который позволяет «добавить» новые методы к существующему типу (class, struct, interface), не изменяя его исходный код и не создавая наследника. Такие методы выглядят как обычные instance‑методы, но реализуются в отдельном static‑классе.
Основные характеристики
using System;
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
class Program
{
static void Main()
{
string sentence = "C# extension methods are powerful";
Console.WriteLine("Word Count: " + sentence.WordCount());
}
}
Результат: Word Count: 5 Метод WordCount() выглядит как встроенный метод строки.
class Student
{
public string Name { get; set; }
public int Marks { get; set; }
}
public static class StudentExtensions
{
public static void PrintResult(this Student s)
{
Console.WriteLine(s.Marks >= 40
? $"{s.Name} Passed"
: $"{s.Name} Failed");
}
}
class Program
{
static void Main()
{
var s1 = new Student { Name = "Alex", Marks = 75 };
var s2 = new Student { Name = "Maria", Marks = 35 };
s1.PrintResult(); // Alex Passed
s2.PrintResult(); // Maria Failed
}
}
public interface ILogger
{
void Log(string message);
}
public static class LoggerExtensions
{
public static void LogError(this ILogger logger, string error)
{
logger.Log("ERROR: " + error);
}
}
Теперь любой класс, реализующий ILogger, автоматически получает метод LogError().
C# работает на платформе .NET, которая:
C# — это:
1. Какой тип данных используется для хранения целых чисел в C#?
Подсказка: В C# существуют разные числовые типы: целочисленные (без дробной части) и с плавающей точкой. Они различаются по размеру и диапазону значений. Подумай о базовых числовых типах: есть отдельные для целых и для дробных значений. Нужен именно без дробной части.
2. Как обозначается точка входа в программу?
Подсказка:Каждое консольное приложение в C# должно иметь метод, который служит стартом выполнения. Он имеет фиксированное имя и сигнатуру. Это специальный метод, с которого начинается выполнение программы. Он всегда вызывается первым.
3. Какой тип данных используется для хранения текста?
Подсказка: Текст в C# — это последовательность символов. Для этого используется отдельный ссылочный тип данных. Подумай: один символ — это один тип, а строка символов — другой.
4. Как объявить переменную с автоматическим определением типа?
Подсказка: В C# поддерживается вывод типа (type inference), при котором компилятор сам определяет тип переменной на этапе компиляции. Есть ключевое слово, которое позволяет компилятору самому определить тип по значению.
5. Какой оператор используется для сравнения переменных?
Подсказка:В языках программирования есть отдельные операторы для присваивания значения и для сравнения значений. Не путай с оператором присваивания — это две разные операции.
6. Как объявляется массив в Си шарп?
Подсказка: Массив — это структура данных, содержащая элементы одного типа, расположенные последовательно в памяти. В C# сначала указывается тип элементов, затем обозначается, что это коллекция фиксированного размера.
7. Какой цикл используется для перебора коллекции?
Подсказка:В C# есть несколько видов циклов, но один из них оптимизирован именно для перебора элементов коллекций. Есть цикл, специально предназначенный для работы с коллекциями, без индексов.
8. Что означает ключевое слово class?
Подсказка: Класс — это шаблон (описание), по которому создаются объекты. Он может содержать поля, методы и свойства. Это основа объектно-ориентированного программирования.
9. Какой тип данных принимает значения true или false?
Подсказка:В C# есть специальный тип для хранения логических значений: истина или ложь. Это логический тип, используемый в условиях.
10. Как объявить метод без возвращаемого значения?
Подсказка:Методы в C# могут возвращать значение или ничего не возвращать. Для второго случая используется отдельное ключевое слово.
11. Какой тип используется для хранения дробных чисел?
Подсказка: Для чисел с дробной частью используются типы с плавающей точкой, которые позволяют хранить значения с точностью.
12. Какой тип данных является ссылочным?
Подсказка: В C# есть два основных вида типов: значимые (value types) и ссылочные (reference types). Подумай: хранит ли переменная само значение или ссылку на объект?
13. Какой оператор используется для логического И?
Подсказка:Логические операторы используются для объединения условий. Они работают с булевыми значениями. Оператор должен вернуть true только если оба условия истинны.
14. Как создать объект класса и называется инстацирование?
Подсказка:Объект создается на основе класса с помощью оператора, который выделяет память и вызывает конструктор. Для создания экземпляра используется специальное ключевое слово.
15. Что такое делегат?
Подсказка: Делегаты — это типы, которые могут хранить ссылки на методы и вызывать их. Это связано с передачей методов как параметров.
16. Что такое событие (event) в C#?
Подсказка:События в C# построены на делегатах и позволяют реализовать шаблон "наблюдатель". Используется для реализации механизма подписки и уведомлений.
17. Что такое generics в C#?
Подсказка:Обобщения (generics) позволяют создавать универсальные классы и методы, не привязанные к конкретному типу. Позволяет писать код, который работает с разными типами.
18. Какой тип используется для ключ-значение в C#?
Подсказка:В C# есть коллекции, которые реализуют ассоциативные массивы (ключ - значение). Структура, где каждому ключу соответствует значение.
19. Что делает ключевое слово static в C#?
Подсказка: Статические члены принадлежат классу, а не конкретному экземпляру. Связано не с объектом, а с самим классом.
20. Какой тип позволяет хранить любой тип данных?
Подсказка:В C# существует универсальный тип, от которого наследуются все остальные типы. Это базовый тип для всех объектов.
21. Как объявить nullable тип?
Подсказка:Nullable-типы позволяют значимым типам принимать значение null. Есть способ указать, что значение может отсутствовать.
22. Что делает try-catch?
Подсказка:Конструкция обработки исключений позволяет перехватывать ошибки во время выполнения программы. Используется при работе с потенциально опасным кодом.
23. Какой тип данных хранит один символ?
Подсказка:В C# есть отдельный тип для хранения одного символа Unicode. Не путай со строкой — там может быть много символов.
24. Какой тип используется для даты и времени?
Подсказка:C# предоставляет специальный тип для хранения даты и времени с возможностью выполнения операций над ними. Стандартный встроенный тип для работы с датами.
25. Какой метод выводит текст в консоль?
Подсказка: В .NET есть класс для ввода/вывода через консоль, содержащий методы для отображения текста. Относится к стандартному классу для работы с консолью.
26. Что означает `where T : class` в generic-ограничении?
Подсказка: В обобщениях (generics) можно ограничивать типы. Ограничение class означает, что параметр должен поддерживать поведение ссылочных типов: передача по ссылке, возможность быть null. это не значение (value), а ссылка.
27. Что делает оператор `??`?
Подсказка: Это оператор объединения с null (null-coalescing). Он проверяет значение и подставляет запасной вариант, если оно отсутствует (null).
«если слева пусто — бери справа».
28. Какой модификатор позволяет переопределить метод в дочернем классе?
Подсказка:Чтобы метод можно было изменить (переопределить) в наследнике, его нужно пометить в базовом классе.
Намек: это как «разрешение на изменение поведения».
29. Какой модификатор используется при переопределении метода?
Подсказка: В дочернем классе используется специальное ключевое слово, чтобы заменить реализацию базового метода.
Намек: «переписать поверх существующего».
30. Что делает `IEnumerable
Подсказка:Это интерфейс, который позволяет проходить по коллекции последовательно (например, в цикле).
работает с foreach.
31. Чем `IQueryable
Подсказка: Один работает с уже загруженными данными, другой может формировать запрос (например, SQL) и выполнять его позже.
«ленивое выполнение и удаленный источник».
32. Что означает `async` у метода?
Подсказка: Позволяет методу использовать асинхронные операции и писать код как будто он синхронный.
нужен для работы с await.
33. Что возвращает `Task
Подсказка:Представляет асинхронную операцию. Может возвращать результат или просто сигнал завершения.
обертка над будущим результатом.
34. Что делает `await`?
Подсказка: Приостанавливает выполнение метода до завершения задачи, но не блокирует поток.
«подожди, но не замораживай поток».
35. Что такое boxing?
Подсказка: Когда значение (value type) упаковывается в объект (object или интерфейс).
значение превращается в ссылку.
36. Что такое unboxing?
Подсказка: Обратный процесс — извлечение значения из объекта. вернуть «чистое значение» обратно.
37. Чем `struct` отличается от `class`?
Подсказка: Один хранится как значение (копируется), другой как ссылка. struct — это value type.
38. Что означает `readonly` для поля?
Подсказка:Поле можно установить только один раз — при объявлении или в конструкторе. после создания менять нельзя.
39. Что означает `const`?
Подсказка:Значение фиксировано еще до запуска программы (на этапе компиляции). вообще не меняется никогда.
40. Что делает `yield return`?
Подсказка:Позволяет возвращать элементы по одному, создавая ленивую последовательность. «не сразу все, а по частям».
41. Что такое extension method?
Подсказка:Позволяет добавить метод к существующему типу без изменения его кода. как будто «добавили метод к чужому классу».
42. Как должен быть объявлен extension method?
Подсказка: Есть строгие правила: метод и класс должны быть специальными, а первый параметр указывает, что расширяется. ключевое слово this в параметре.
43. Что делает LINQ-метод `Select`?
Подсказка:Преобразует каждый элемент в новый вид. «map» в других языках.
44. Что делает LINQ-метод `Where`?
Подсказка:Отбирает элементы по условию. фильтр.
45. Что означает `sealed class`?
Подсказка:Запрещает наследование от класса. «дальше продолжать нельзя». (эквивалент finsl в других языках программирования)
46. Что такое nullable reference types?
Подсказка:Позволяют компилятору отслеживать, где возможен null, и предупреждать об ошибках. контроль null на этапе компиляции.
47. Что делает оператор `?.`?
Подсказка: Безопасный доступ к объекту: если он null, не будет ошибки. «проверь перед обращением».
48. Чем `abstract class` отличается от `interface`?
Подсказка:Один может хранить состояние и реализацию, другой — только контракт (в классическом понимании). наличие полей и кода внутри.
49. Что делает `using` при работе с `IDisposable`?
Подсказка: Автоматически освобождает ресурсы после использования объекта. вызов Dispose() без твоего участия.
50. Что такое delegate в C#?
51. Что происходит при covariance в делегатах?
52. Что означает contravariance?
53. Что такое expression tree (`Expression
54. Чем отличается `Func
55. Что делает `Span
56. Почему `Span
57. Что делает ключевое слово `ref` при передаче параметра?
58. Чем `ref` отличается от `out`?
59. Что такое `in` параметр?
60. Что делает `readonly struct`?
61. Что делает `stackalloc`?
62. Что означает `await using`?
63. Что делает `IAsyncEnumerable
64. Что означает `yield break`?
65. Что делает `ConfigureAwait(false)`?
66. Что такое boxing cost?
67. Что делает `lock`?
68. Что такое deadlock?
69. Что делает `volatile`?
70. Что такое GC (Garbage Collector)?
71. Что означает `weak reference`?
72. Что делает `Activator.CreateInstance`?
73. Что такое reflection?
74. Что делает `nameof()`?
75. Что такое JIT-компиляция?
Комментарии
Оставить комментарий
Языки и методы программирования. Теория трансляции
Термины: Языки и методы программирования. Теория трансляции