Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки

Лекция Тесты



Другие правильно ответили на 34% вопросов

1. Что такое c#

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

Используется для:

  • веб-разработки (ASP.NET)
  • десктоп-приложений (WPF, WinForms)
  • игр (Unity)
  • сервисов и API

Особенности языка C# :

  • строго типизированный
  • компилируемый
  • объектно-ориентированный
  • работает внутри экосистемы .NET
  • язык высокого уровня

В отличие от:

  • PHP / JS - динамические
  • Python -интерпретируемый
  • C++ - без managed runtime
  • Ассемблер - язык низкого уровня

Сравнение с другими языками Javascript, C++, C, PHP

Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки

2. Простая программа в C#:

using System;

class Program
{
static void Main()
{
Console.WriteLine("Hello, World!");
}
}

Разбор:

  • using System; — подключение библиотеки
  • class Program — объявление класса
  • Main() — точка входа в программу
  • Console.WriteLine() — вывод в консоль

3. Переменные в C#:

3.1 Переменная — это именованная область памяти, в которой хранится значение определенного типа.

Основные типы:

int a = 10; // целое число
double b = 3.14; // дробное
bool isTrue = true; // логический тип
string text = "Hi"; // строка

Особенности:

  • C# — строго типизированный язык
  • тип указывается явно (или через var)
var x = 5; // компилятор сам определит тип (int)

3.2 В C# есть два основных типа хранения (Stack vs Heap):

Stack (стек)

  • Быстрая память
  • Хранит:
    • Значимые типы (int, double, struct)
    • Ссылки на объекты
  • Живет в рамках метода
int a = 5; // хранится в стеке

Heap (куча)

  • Медленнее, но гибче
  • Хранит:
    • Объекты (class)
  • Управляется сборщиком мусора
var obj = new MyClass(); // объект в куче

Важно

  • Значимые типы - копируются
  • Ссылочные типы - передается ссылка
int a = 5;
int b = a; // копия

MyClass o1 = new MyClass();
MyClass o2 = o1; // ссылка

3.3 Передача параметров: value vs reference

По значению (по умолчанию)

void Foo(int x)
{
x = 100;
}

Изменения не влияют на оригинал

3.4. Ключевые слова: ref, out, in

ref — передача по ссылке (чтение + запись)

void Update(ref int x)
{
x = 50;
}

int a = 10;
Update(ref a); // a = 50

Требования:

  • Переменная должна быть инициализирована

out — выходной параметр

void GetValue(out int x)
{
x = 42;
}

int result;
GetValue(out result);

Особенности:

  • Можно не инициализировать перед вызовом
  • Обязательно присвоить внутри метода

in — только чтение (read-only ссылка)

void Print(in int x)
{
Console.WriteLine(x);
}
Особенности:
  • Передается по ссылке
  • Нельзя изменять

Сравнение

Модификатор Чтение Запись Требует инициализации
value да да да
ref да да да
out нет да нет
in да нет да

3.5. Особенности значимых и ссылочных типов

struct (value type)

struct Point
{
public int X;
}
  • Хранится в стеке
  • Копируется полностью

class (reference type)

class User
{
public string Name;
}
  • Объект в куче
  • Передается ссылка

3.6. Garbage Collector (GC)

В .NET есть автоматический сборщик мусора.

Что делает GC:

  • Освобождает память
  • Удаляет неиспользуемые объекты

Пример

var obj = new MyClass();
obj = null; // объект больше не используется

GC позже удалит его из памяти (не сразу) , не будет особождение памяти при выходе из метода,при obj = null,сразу после удаления ссылки

а будет

  • Когда в куче (Heap) не хватает места для нового объекта
  • Когда достигнут порог аллокаций
  • При нехватке системных ресурсов(мало RAM,система под нагрузкой)
  • При явном вызове (редко нужно) GC.Collect();
  • При переходе между поколениями (Generations)
  • В фоне (Background GC)
  • GC работает по поколениям:
Поколение Что хранит
Gen 0 новые объекты
Gen 1 пережили 1 сборку
Gen 2 долгоживущие

Когда Gen 0 переполнен - быстрый GC
Когда Gen 2 - тяжелая полная сборка

Особенности:

  • Нельзя точно предсказать момент удаления
  • Работает поколениями:
    • Gen 0 (молодые)
    • Gen 1
    • Gen 2 (долгоживущие)

3.7. Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки — работа с памятью без аллокаций

Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки— это современный инструмент для работы с памятью без копирования.

Пример

Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки numbers = stackalloc int[3] {1, 2, 3};

Особенности:

  • Работает с:
    • массивами
    • стеком
    • unmanaged памятью
  • НЕ аллоцирует память в куче
  • Очень быстрый

Ограничения:

  • Только внутри метода
  • Нельзя хранить в полях класса

ReadOnlySpan

ReadOnlySpan<char> text = "Hello";

3.8. Stackalloc (связано с Span)

Span<int> data = stackalloc int[10];
  • Выделяет память в стеке
  • Очень быстро
  • Без GC

3.9. Важные практические выводы

Когда использовать что

Ситуация Использовать
Маленькие данные value type
Большие объекты class
Нужно изменить аргумент ref
Нужно вернуть несколько значений out
Только чтение без копии in
Высокая производительность Span

3.10. Частые ошибки

Копирование больших struct
Неправильное использование ref/out
Утечки памяти через ссылки
Попытка сохранить Span в поле класса

3.11. Итог

Переменные в C# — это не просто «контейнеры», а механизм управления памятью:

  • Stack vs Heap
  • Value vs Reference
  • ref / out / in
  • GC управляет памятью
  • Span дает высокую производительность
Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки

4.Типы данных в C#:

В C# типы данных можно разделить на несколько групп.

4.1. Целые числа

byte //беззнаковый 8‑битный тип Диапазон: 0255
short //   знаковый 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;

4.2. Дробные числа

float // менее точный
double // стандартный дробный тип
decimal // точный, часто для денег

Пример:

double price = 10.5;
float price = 10.5f;
decimal money = 99.99m;
f у флоат типа обязательно. если не будет то будет доубле тип по умолчани у числа с точкой

m у decimal обязательно:

decimal salary = 1200.50m;

4.3. Логический тип

bool isActive = true;
bool isDeleted = false;

4.4. Символ и строка

char letter = 'A';
string name = "Ivan";

Важно:

char // один символ, одинарные кавычки
string // текст, двойные кавычки

4.5. Дата и время

DateTime now = DateTime.Now;
DateTime birthday = new DateTime(2000, 5, 10);

4.6. Массивы

int[] numbers = { 1, 2, 3 };
string[] names = { "Ivan", "Olga" };

4.7. Коллекции

List<string> users = new List<string>();

Dictionary<string, int> ages = new Dictionary<string, int>();

4.8. Объекты и классы

class User
{
public string Name { get; set; }
public int Age { get; set; }
}

User user = new User();

4.9. Nullable-типы

Обычный int не может быть null:

int age = null; // ошибка

Но можно так:

int? age = null;
DateTime? deletedAt = null;

4.10. object

object может хранить значение любого типа:

object value = 123;
object text = "Hello";

Но лучше использовать конкретные типы, а не object.

4.11. Массивы в C#:

int[] numbers = {1, 2, 3, 4};

Console.WriteLine(numbers ); // 1

Перебор:

foreach (var n in numbers)
{
Console.WriteLine(n);
}

4.12 Делегаты и события в си шарп е

Делегаты — да, это отдельный тип.
В 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 — событие.

4.13. C# кортежи (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 для автоматического вывода типов.

  • Кортежи удобны для возврата нескольких значений из метода без создания отдельного класса.

Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки

Короткая таблица типов данных в Си шарпе

Тип Для чего
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 нет Обертка над делегатом (не тип)

4.14 преобразование типов в СИ шарпе Casting Boxing Unboxing

Переменные и классы одного типа можно превращать в сущности других типов с помощью кастинга, боксинга и анбоксинга

Кастинг в 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 → double, Base → Derived).
  • Боксинг всегда означает переход от value type к reference type.
  • Анбоксинг — обратный процесс, всегда требует явного указания типа.
  • Производительность: боксинг/анбоксинг дороже, чем обычный кастинг, так как задействует кучу и копирование данных.

5. Операторы в C#:

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");
}

6. Условия в C#:

int x = 10;

if (x > 5)
{
Console.WriteLine("Больше 5");
}
else
{
Console.WriteLine("Меньше или равно 5");
}

switch:

int day = 1;

switch (day)
{
  case 1:
    Console.WriteLine("Понедельник");
    break;
 case 2:
    Console.WriteLine("Вторник");
    break;
  default:
    Console.WriteLine("Другой день");
    break;
}

7. Циклы в C#:

for:

for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}

while:

int i = 0;
while (i < 5)
{
  Console.WriteLine(i);
  i++;
}
В C# цикл foreach используется, когда нужно пройти по всем элементам коллекции: массива, списка, словаря и т.д.

В 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

8. Методы (функции) в C#:

static int Sum(int a, int b)
{
return a + b;
}

Использование:

int result = Sum(2, 3);

9. Классы и ООП в C#:

Пример класса:

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();// вызов метода

9.1. Инкапсуляция (свойства)

 
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;
    }
}

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

9.2. Наследование

class Animal
{
  public void Speak()
  {
   Console.WriteLine("Звук");
  }
}

class Dog : Animal
{
 name  = "Dog";
}
Класс Dog расширяет родительский класс Animal (добавляет или переопределяет родительские мемтоды или свойства)

9.3. Полиморфизм

class Animal
{
  public virtual void Speak()
  {
  Console.WriteLine("Звук");
  }
}

class Dog : Animal
{
  public override void Speak()
  {
  Console.WriteLine("Гав");
  }
}
переопределение родительских методов если разрешено

10. Исключения (ошибки) и их перехват в C#:

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 (до C# 8.0)

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

using (var stream = new FileStream("test.txt", FileMode.Create))
{
    // Работаем с файлом
} // Здесь автоматически вызывается stream.Dispose()

using declaration (начиная с C# 8.0)

Более современный и лаконичный способ. Вам не нужны фигурные скобки — ресурс будет освобожден в конце текущего метода или блока кода.

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.

11. Дженерики (Generics) в C#

Дженерики (Generics) в C# — это способ писать универсальный код, который работает с разными типами данных, без потери типизации.

Простое определение

Дженерик — это шаблон типа, где конкретный тип подставляется позже.

Пример без дженериков (плохо)

class Box
{
public object Value;
}

Проблемы:

  • нет проверки типов
  • нужно кастить
Box box = new Box();
box.Value = 123;

int x = (int)box.Value; // каст

С дженериками (правильно)

 Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки

Использование:

Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки

Никаких кастов, все строго типизировано

Где используются дженерики

11.1. Дженерики в Коллекцииях

Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки
  • Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки— это список, который может хранить только int. Попытка добавить строку вызовет ошибку компиляции.

  • Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки — словарь, где ключи строго string, а значения строго int. Это гарантирует типобезопасность.

List — это дженерик

11.2. Дженерики в Методах (класса)

Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки

Использование:

int x = GetFirst(new int[] {1, 2, 3});
string s = GetFirst(new string[] {"a", "b"});

11.3. Дженерики в Ограничениях (constraints) типа класса

Можно указать, какие типы разрешены:

Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки

Примеры:

where T : class // только ссылочные типы
where T : struct // только значимые
where T : new() // должен быть конструктор

В чем сила дженериков

Без generics С generics
object конкретный тип
касты без кастов
ошибки в runtime ошибки на этапе компиляции
медленнее быстрее

Ключевая идея

Дженерики = тип передается как параметр

Основы языка программирования C# (C Sharp, Си Шарп) с тестами для самопроверки

Тут T — это “любой тип”

Итог

  • Дженерики делают код:
    • универсальным
    • безопасным
    • быстрым
  • используются везде (коллекции, LINQ, API)

Сравнение с 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)

12. Extension method в C#

Extension method в C# — это статический метод, который позволяет «добавить» новые методы к существующему типу (class, struct, interface), не изменяя его исходный код и не создавая наследника. Такие методы выглядят как обычные instance‑методы, но реализуются в отдельном static‑классе.

Основные характеристики

  • Определяются в static‑классе.
  • Метод должен быть static.
  • Первый параметр метода содержит ключевое слово this и указывает тип, который расширяется.
  • Вызываются как обычные методы экземпляра: obj.MethodName().
  • Работают даже для sealed‑классов (например, string), которые нельзя наследовать.

Пример 1: Расширение встроенного типа string в C#

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() выглядит как встроенный метод строки.

Пример 2: Расширение пользовательского класса в C#

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
    }
}

Пример 3: Расширение интерфейса в C#

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().

Где применяются Расширения

  • LINQ — стандартные методы (OrderBy, GroupBy, Average) реализованы как extension methods для IEnumerable.
  • Удобно для добавления утилитарных методов к типам, которые нельзя менять (например, string, DateTime).
  • Повышает читаемость и повторное использование кода.

13. Работа с .NET в C#:

C# работает на платформе .NET, которая:

  • управляет памятью (Garbage Collector)
  • предоставляет библиотеки
  • позволяет писать кроссплатформенные приложения

Итог

C# — это:

  • строгая типизация
  • мощная ООП модель
  • тесная интеграция с .NET
  • универсальность (web, desktop, game dev)

Тесты для самопроверки

1. Какой тип данных используется для хранения целых чисел в C#?

  • string
  • double
  • int *
  • bool

Подсказка: В C# существуют разные числовые типы: целочисленные (без дробной части) и с плавающей точкой. Они различаются по размеру и диапазону значений. Подумай о базовых числовых типах: есть отдельные для целых и для дробных значений. Нужен именно без дробной части.

2. Как обозначается точка входа в программу?

  • Start()
  • Run()
  • Main() *
  • Init()

Подсказка:Каждое консольное приложение в C# должно иметь метод, который служит стартом выполнения. Он имеет фиксированное имя и сигнатуру. Это специальный метод, с которого начинается выполнение программы. Он всегда вызывается первым.

3. Какой тип данных используется для хранения текста?

  • char
  • string *
  • int
  • bool

Подсказка: Текст в C# — это последовательность символов. Для этого используется отдельный ссылочный тип данных. Подумай: один символ — это один тип, а строка символов — другой.

4. Как объявить переменную с автоматическим определением типа?

  • auto x = 5;
  • var x = 5; *
  • dynamic x = 5;
  • let x = 5;

Подсказка: В C# поддерживается вывод типа (type inference), при котором компилятор сам определяет тип переменной на этапе компиляции. Есть ключевое слово, которое позволяет компилятору самому определить тип по значению.

5. Какой оператор используется для сравнения переменных?

  • =
  • == *
  • var
  • ===

Подсказка:В языках программирования есть отдельные операторы для присваивания значения и для сравнения значений. Не путай с оператором присваивания — это две разные операции.

6. Как объявляется массив в Си шарп?

  • int numbers[];
  • array int numbers;
  • int[] numbers; *
  • numbers = int[];

Подсказка: Массив — это структура данных, содержащая элементы одного типа, расположенные последовательно в памяти. В C# сначала указывается тип элементов, затем обозначается, что это коллекция фиксированного размера.

7. Какой цикл используется для перебора коллекции?

  • for
  • while
  • foreach *
  • loop

Подсказка:В C# есть несколько видов циклов, но один из них оптимизирован именно для перебора элементов коллекций. Есть цикл, специально предназначенный для работы с коллекциями, без индексов.

8. Что означает ключевое слово class?

  • Обявить классификациюпеременных
  • Начать класификцию кортеджей
  • Объявить Класс *
  • Объявить Интерфейс

Подсказка: Класс — это шаблон (описание), по которому создаются объекты. Он может содержать поля, методы и свойства. Это основа объектно-ориентированного программирования.

9. Какой тип данных принимает значения true или false?

  • checkbox
  • bool *
  • boolean
  • binary

Подсказка:В C# есть специальный тип для хранения логических значений: истина или ложь. Это логический тип, используемый в условиях.

10. Как объявить метод без возвращаемого значения?

  • null
  • empty
  • void *
  • none

Подсказка:Методы в C# могут возвращать значение или ничего не возвращать. Для второго случая используется отдельное ключевое слово.

11. Какой тип используется для хранения дробных чисел?

  • nonint
  • fraction
  • double *
  • char

Подсказка: Для чисел с дробной частью используются типы с плавающей точкой, которые позволяют хранить значения с точностью.

12. Какой тип данных является ссылочным?

  • int
  • double
  • string *
  • bool

Подсказка: В C# есть два основных вида типов: значимые (value types) и ссылочные (reference types). Подумай: хранит ли переменная само значение или ссылку на объект?

13. Какой оператор используется для логического И?

  • and
  • && *
  • union
  • &

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

14. Как создать объект класса и называется инстацирование?

  • create
  • new *
  • init
  • make

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

15. Что такое делегат?

  • Тип данных для хранения методов *
  • Класс
  • Интерфейс
  • Переменная

Подсказка: Делегаты — это типы, которые могут хранить ссылки на методы и вызывать их. Это связано с передачей методов как параметров.

16. Что такое событие (event) в C#?

  • Тип данных
  • Метод
  • Обертка над делегатом *
  • Класс

Подсказка:События в C# построены на делегатах и позволяют реализовать шаблон "наблюдатель". Используется для реализации механизма подписки и уведомлений.

17. Что такое generics в C#?

  • Тип цикла
  • Шаблон типов *
  • Метод
  • Интерфейс

Подсказка:Обобщения (generics) позволяют создавать универсальные классы и методы, не привязанные к конкретному типу. Позволяет писать код, который работает с разными типами.

18. Какой тип используется для ключ-значение в C#?

  • List
  • Array
  • Dictionary *
  • Queue

Подсказка:В C# есть коллекции, которые реализуют ассоциативные массивы (ключ - значение). Структура, где каждому ключу соответствует значение.

19. Что делает ключевое слово static в C#?

  • Делает метод приватным
  • Привязывает к классу *
  • Удаляет объект
  • Создает объект

Подсказка: Статические члены принадлежат классу, а не конкретному экземпляру. Связано не с объектом, а с самим классом.

20. Какой тип позволяет хранить любой тип данных?

  • int
  • string
  • object *
  • bool

Подсказка:В C# существует универсальный тип, от которого наследуются все остальные типы. Это базовый тип для всех объектов.

21. Как объявить nullable тип?

  • int!
  • int? *
  • ?int
  • int null

Подсказка:Nullable-типы позволяют значимым типам принимать значение null. Есть способ указать, что значение может отсутствовать.

22. Что делает try-catch?

  • Запускает цикл
  • Обрабатывает ошибки *
  • Создает объект
  • Сравнивает значения

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

23. Какой тип данных хранит один символ?

  • string
  • char *
  • symbol
  • byte

Подсказка:В C# есть отдельный тип для хранения одного символа Unicode. Не путай со строкой — там может быть много символов.

24. Какой тип используется для даты и времени?

  • Time
  • Date
  • DateTime *
  • Calendar

Подсказка:C# предоставляет специальный тип для хранения даты и времени с возможностью выполнения операций над ними. Стандартный встроенный тип для работы с датами.

25. Какой метод выводит текст в консоль?

  • print()
  • echo()
  • Console.WriteLine() *
  • log()

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

26. Что означает `where T : class` в generic-ограничении?

  • T должен быть enum
  • T должен быть ссылочным типом *
  • T должен быть числом
  • T должен быть статическим классом

Подсказка: В обобщениях (generics) можно ограничивать типы. Ограничение class означает, что параметр должен поддерживать поведение ссылочных типов: передача по ссылке, возможность быть null. это не значение (value), а ссылка.

27. Что делает оператор `??`?

  • Проверяет тип объекта
  • Возвращает левое значение, если оно не null, иначе правое *
  • Создает nullable-переменную
  • Сравнивает две строки

Подсказка: Это оператор объединения с null (null-coalescing). Он проверяет значение и подставляет запасной вариант, если оно отсутствует (null).
«если слева пусто — бери справа».

28. Какой модификатор позволяет переопределить метод в дочернем классе?

  • sealed
  • virtual *
  • static
  • readonly

Подсказка:Чтобы метод можно было изменить (переопределить) в наследнике, его нужно пометить в базовом классе.
Намек: это как «разрешение на изменение поведения».

29. Какой модификатор используется при переопределении метода?

  • override *
  • overload
  • rewrite
  • extends

Подсказка: В дочернем классе используется специальное ключевое слово, чтобы заменить реализацию базового метода.
Намек: «переписать поверх существующего».

30. Что делает `IEnumerable`?

  • Позволяет объекту быть перечисляемым через foreach *
  • Создает словарь
  • Запускает поток
  • Сохраняет данные в файл

Подсказка:Это интерфейс, который позволяет проходить по коллекции последовательно (например, в цикле).
работает с foreach.

31. Чем `IQueryable` отличается от `IEnumerable`?

  • IQueryable используется только для массивов
  • IQueryable может строить выражение запроса для удаленного источника данных *
  • IQueryable не поддерживает LINQ
  • IQueryable всегда быстрее IEnumerable

Подсказка: Один работает с уже загруженными данными, другой может формировать запрос (например, SQL) и выполнять его позже.
«ленивое выполнение и удаленный источник».

32. Что означает `async` у метода?

  • Метод автоматически запускается в отдельном процессе
  • Метод может использовать await внутри себя *
  • Метод становится статическим
  • Метод блокирует поток

Подсказка: Позволяет методу использовать асинхронные операции и писать код как будто он синхронный.
нужен для работы с await.

33. Что возвращает `Task`?

  • Только ошибку
  • Асинхронную операцию с результатом типа T *
  • Новый поток
  • Ссылку на класс

Подсказка:Представляет асинхронную операцию. Может возвращать результат или просто сигнал завершения.
обертка над будущим результатом.

34. Что делает `await`?

  • Удаляет задачу из памяти
  • Ожидает завершения асинхронной операции без обычной блокировки потока *
  • Создает новый класс
  • Прерывает выполнение программы

Подсказка: Приостанавливает выполнение метода до завершения задачи, но не блокирует поток.
«подожди, но не замораживай поток».

35. Что такое boxing?

  • Преобразование ссылочного типа в значимый
  • Преобразование значимого типа в object или интерфейс *
  • Удаление объекта сборщиком мусора
  • Создание массива

Подсказка: Когда значение (value type) упаковывается в объект (object или интерфейс).
значение превращается в ссылку.

36. Что такое unboxing?

  • Извлечение значимого типа из object *
  • Преобразование строки в число
  • Создание generic-класса
  • Копирование массива

Подсказка: Обратный процесс — извлечение значения из объекта. вернуть «чистое значение» обратно.

37. Чем `struct` отличается от `class`?

  • struct является ссылочным типом
  • struct является значимым типом *
  • class нельзя наследовать
  • struct всегда хранится только в куче

Подсказка: Один хранится как значение (копируется), другой как ссылка. struct — это value type.

38. Что означает `readonly` для поля?

  • Поле можно изменить только в объявлении или конструкторе *
  • Поле можно изменить в любом методе
  • Поле становится nullable
  • Поле удаляется после выполнения метода

Подсказка:Поле можно установить только один раз — при объявлении или в конструкторе. после создания менять нельзя.

39. Что означает `const`?

  • Значение вычисляется во время выполнения
  • Значение известно на этапе компиляции и не изменяется *
  • Значение можно менять в конструкторе
  • Значение хранится только в базе данных

Подсказка:Значение фиксировано еще до запуска программы (на этапе компиляции). вообще не меняется никогда.

40. Что делает `yield return`?

  • Возвращает все элементы сразу
  • Позволяет возвращать элементы последовательности по одному *
  • Завершает приложение
  • Создает новый поток

Подсказка:Позволяет возвращать элементы по одному, создавая ленивую последовательность. «не сразу все, а по частям».

41. Что такое extension method?

  • Метод, который расширяет существующий тип без изменения его кода *
  • Метод, который работает только внутри конструктора
  • Метод, который нельзя вызвать
  • Метод для удаления класса

Подсказка:Позволяет добавить метод к существующему типу без изменения его кода. как будто «добавили метод к чужому классу».

42. Как должен быть объявлен extension method?

  • В нестатическом классе и без параметров
  • В static-классе, static-методом, с `this` у первого параметра *
  • Только внутри enum
  • Только как private-метод

Подсказка: Есть строгие правила: метод и класс должны быть специальными, а первый параметр указывает, что расширяется. ключевое слово this в параметре.

43. Что делает LINQ-метод `Select`?

  • Фильтрует элементы
  • Преобразует каждый элемент последовательности *
  • Сортирует элементы
  • Удаляет элементы

Подсказка:Преобразует каждый элемент в новый вид. «map» в других языках.

44. Что делает LINQ-метод `Where`?

  • Фильтрует элементы по условию *
  • Создает новый поток
  • Преобразует элементы в строку
  • Завершает программу

Подсказка:Отбирает элементы по условию. фильтр.

45. Что означает `sealed class`?

  • От такого класса нельзя наследоваться *
  • Такой класс обязательно abstract
  • Такой класс является enum
  • Такой класс можно использовать только один раз

Подсказка:Запрещает наследование от класса. «дальше продолжать нельзя». (эквивалент finsl в других языках программирования)

46. Что такое nullable reference types?

  • Возможность явно контролировать null для ссылочных типов на уровне анализа компилятора *
  • Новый тип базы данных
  • Только сокращение для `int?`
  • Способ отключить исключения

Подсказка:Позволяют компилятору отслеживать, где возможен null, и предупреждать об ошибках. контроль null на этапе компиляции.

47. Что делает оператор `?.`?

  • Безопасно обращается к члену объекта, если объект не null *
  • Создает новый nullable-тип
  • Сравнивает два объекта
  • Преобразует object в string

Подсказка: Безопасный доступ к объекту: если он null, не будет ошибки. «проверь перед обращением».

48. Чем `abstract class` отличается от `interface`?

  • abstract class может содержать состояние и базовую реализацию *
  • interface всегда хранит поля экземпляра
  • abstract class нельзя наследовать
  • interface можно создать через new напрямую

Подсказка:Один может хранить состояние и реализацию, другой — только контракт (в классическом понимании). наличие полей и кода внутри.

49. Что делает `using` при работе с `IDisposable`?

  • Автоматически вызывает Dispose после выхода из блока *
  • Создает новый namespace
  • Отключает Garbage Collector
  • Делает объект статическим

Подсказка: Автоматически освобождает ресурсы после использования объекта. вызов Dispose() без твоего участия.

50. Что такое delegate в C#?

  • Тип, который хранит ссылку на метод с определенной сигнатурой *
  • Только ключевое слово для цикла
  • Способ создать enum
  • Метод для сериализации объекта

51. Что происходит при covariance в делегатах?

  • Параметры могут быть более производными типами
  • Возвращаемый тип может быть более производным *
  • Делегат нельзя вызвать
  • Все параметры становятся nullable

52. Что означает contravariance?

  • Возвращаемый тип более общий
  • Параметры могут быть более общими типами *
  • Делегат становится async
  • Тип нельзя изменить

53. Что такое expression tree (`Expression`)?

  • Скомпилированный код
  • Представление кода в виде дерева выражений *
  • Только строка SQL
  • Тип массива

54. Чем отличается `Func` от `Expression>`?

  • Func — это строка
  • Expression хранит структуру выражения, а не выполняемый код *
  • Func нельзя вызвать
  • Expression всегда быстрее

55. Что делает `Span`?

  • Создает список
  • Представляет непрерывный участок памяти без выделения *
  • Сохраняет данные в БД
  • Создает поток

56. Почему `Span` нельзя хранить в поле класса?

  • Он слишком большой
  • Он stack-only тип (ref struct) *
  • Он не поддерживает generics
  • Он работает только с int

57. Что делает ключевое слово `ref` при передаче параметра?

  • Передает копию
  • Передает ссылку на переменную *
  • Делает параметр nullable
  • Делает метод async

58. Чем `ref` отличается от `out`?

  • ref требует инициализации переменной до передачи *
  • out требует инициализации
  • out возвращает список
  • ref работает только со строками

59. Что такое `in` параметр?

  • Передача по значению
  • Передача по ссылке только для чтения *
  • Передача массива
  • Передача делегата

60. Что делает `readonly struct`?

  • Запрещает изменение полей после создания *
  • Делает struct ссылочным типом
  • Делает struct nullable
  • Позволяет наследование

61. Что делает `stackalloc`?

  • Выделяет память в куче
  • Выделяет память на стеке *
  • Удаляет память
  • Создает объект

62. Что означает `await using`?

  • Асинхронный using для IDisposable
  • Асинхронный using для IAsyncDisposable *
  • Обычный using
  • Запуск потока

63. Что делает `IAsyncEnumerable`?

  • Синхронную коллекцию
  • Асинхронную последовательность элементов *
  • Поток данных
  • Делегат

64. Что означает `yield break`?

  • Возвращает значение
  • Завершает итерацию генератора *
  • Прерывает поток
  • Создает список

65. Что делает `ConfigureAwait(false)`?

  • Ускоряет CPU
  • Не возвращает выполнение в исходный контекст синхронизации *
  • Создает новый поток
  • Завершает задачу

66. Что такое boxing cost?

  • Стоимость компиляции
  • Дополнительные расходы памяти и производительности при упаковке значения *
  • Удаление объекта
  • Создание массива

67. Что делает `lock`?

  • Блокирует поток навсегда
  • Обеспечивает потокобезопасный доступ к ресурсу *
  • Создает задачу
  • Удаляет переменную

68. Что такое deadlock?

  • Ошибка компиляции
  • Взаимная блокировка потоков *
  • Утечка памяти
  • Переполнение стека

69. Что делает `volatile`?

  • Делает переменную immutable
  • Гарантирует актуальность значения между потоками *
  • Удаляет переменную
  • Делает переменную static

70. Что такое GC (Garbage Collector)?

  • Поток
  • Система автоматического управления памятью *
  • Компилятор
  • Интерпретатор

71. Что означает `weak reference`?

  • Сильная ссылка
  • Ссылка, не препятствующая сборке мусора *
  • Ссылка на struct
  • Nullable тип

72. Что делает `Activator.CreateInstance`?

  • Удаляет объект
  • Создает объект через reflection *
  • Сравнивает типы
  • Создает поток

73. Что такое reflection?

  • Компиляция
  • Получение информации о типах во время выполнения *
  • Создание массива
  • Работа с файлами

74. Что делает `nameof()`?

  • Возвращает строковое имя переменной/члена *
  • Создает переменную
  • Удаляет метод
  • Выполняет метод

75. Что такое JIT-компиляция?

  • Компиляция во время выполнения *
  • Компиляция только при установке
  • Интерпретация кода
  • Удаление IL-кода

создано: 2026-04-25
обновлено: 2026-05-11
1



Помог ли вам этот ответ?
Нажмите оценку и напишите коротко почему. Так мы сможем сделать следующие ответы точнее и полезнее.
Насколько вы довольны ответом?
Ваш отзыв напрямую влияет на качество следующих подсказок и ответов.


Поделиться:
Пожаловаться

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Языки и методы программирования. Теория трансляции

Термины: Языки и методы программирования. Теория трансляции