Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

+1 128новых вакансий за сутки·93 813вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 269
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 410 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 196
  • Облачные технологии14 160
  • QA вакансии3 451
  • Backend вакансии2 107
  • Инженер данных1 800
  • Продакт-менеджер1 247

Разработка

  • Android1 855
  • iOS1 695
  • Fullstack вакансии995
  • AI вакансии952
  • Frontend вакансии751
  • Mobile вакансии43

По стеку

  • Go8 754
  • Java6 595
  • Node.js2 038
  • .NET1 738
  • Kotlin1 617
  • Rust1 473
  • C#718
  • PHP692
  • C++582

DevOps и инфраструктура

  • Kubernetes7 778
  • DevOps вакансии6 088
  • Linux-инфраструктура5 502
  • Terraform / IaC4 276
  • CI/CD3 275
  • Мониторинг и Observability1 793
  • SRE563
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 141
  • Бизнес-аналитик921
  • Аналитик данных860
  • Системный аналитик154

Другие направления

  • Проджект-менеджер621
  • UI/UX дизайн148
  • Ручное тестирование14

По регионам

  • Вакансии в США44 164
  • Вакансии в Европе24 016
  • Вакансии в Канаде4 533
  • Работа в России3 837

По формату

  • Удалённые вакансии75 134
  • Релокация в США44 163
  • Гибридная работа12 456
  • Офисная работа7 066

По уровню

  • Senior вакансии42 633
  • Middle вакансии20 971
  • Junior вакансии6 706

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме C#Все вопросы
C#JuniorКодинг

Что такое extension methods и как создать свой?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Extension method — статический метод со специальным первым параметром this T, позволяющий синтаксически вызывать его как метод экземпляра без изменения типа. Типичная ловушка: extension на IEnumerable вместо IQueryable тянет все данные из БД в память.

Как создать extension method

// 1. Статический класс (имя может быть любым)
public static class StringExtensions
{
    // 2. Первый параметр — 'this TипРасширяемого'
    public static bool IsNullOrWhiteSpace(this string? value)
        => string.IsNullOrWhiteSpace(value);

    public static string Truncate(this string value, int maxLength)
    {
        ArgumentNullException.ThrowIfNull(value);
        return value.Length <= maxLength
            ? value
            : value[..maxLength] + "…";
    }

    // Extension на интерфейс — работает для всех реализаций
    public static IEnumerable<T> WhereNotNull<T>(this IEnumerable<T?> source)
        where T : class
        => source.Where(x => x is not null)!;
}

// Использование
string title = "Senior Backend Engineer at Google";
Console.WriteLine(title.Truncate(20)); // "Senior Backend Engin…"

List<string?> names = ["Alice", null, "Bob", null];
var valid = names.WhereNotNull().ToList(); // ["Alice", "Bob"]

Extension methods в C#

Extension method — статический метод, который синтаксически вызывается как метод экземпляра, не требуя изменения исходного типа. Это позволяет «расширять» sealed-классы, интерфейсы и сторонние типы без наследования.

Extension methods на generic-типах и ограничениях

public static class CollectionExtensions
{
    // Добавить в коллекцию несколько элементов (аналог Python list.extend)
    public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> items)
    {
        foreach (var item in items)
            collection.Add(item);
    }

    // Безопасный FirstOrDefault с дефолтным значением (не null)
    public static T FirstOrFallback<T>(this IEnumerable<T> source, T fallback)
        => source.DefaultIfEmpty(fallback).First();
}

// Extension на IQueryable для переиспользуемых фильтров
public static class JobQueryExtensions
{
    public static IQueryable<Job> WhereRemote(this IQueryable<Job> query)
        => query.Where(j => j.RemoteType == RemoteType.FullRemote);

    public static IQueryable<Job> OrderByFreshness(this IQueryable<Job> query)
        => query.OrderByDescending(j => j.CreatedAt);
}

// Цепочка:
var remoteJobs = db.Jobs
    .WhereRemote()
    .OrderByFreshness()
    .Take(20)
    .ToListAsync(ct);

Приоритет и разрешение

  • Метод экземпляра всегда имеет приоритет над extension method с той же сигнатурой.
  • Extension method видим только при наличии using пространства имён, в котором объявлен статический класс.
  • Компилятор ищет extension methods в текущем пространстве имён, затем в imported namespaces (от ближайшего к дальнему).

Подводные камни

  • Null receiver. Extension method может быть вызван на null: ((string)null).IsNullOrWhiteSpace() не бросает NullReferenceException, если метод явно обрабатывает null. Это может удивить — документируйте поведение.
  • Скрытие за приоритетом. Если в будущей версии библиотеки появится метод экземпляра с той же сигнатурой, он «победит» extension method без предупреждения компилятора — поведение молча изменится.
  • IQueryable vs IEnumerable. Extension method на IEnumerable<T> вызовет AsEnumerable() неявно, если передать IQueryable<T> — все данные уйдут в память. Создавайте раздельные перегрузки.
  • Видимость через using. Если extension method не видно — проверьте, добавлен ли нужный using. Это частая причина ошибки CS1061.
  • Нельзя переопределить. Extension methods статические — их нельзя переопределить в наследнике. Для полиморфного поведения используйте виртуальные методы или интерфейсы.
  • Не злоупотребляйте. Extension methods хороши для утилитарных операций и fluent API, но чрезмерное использование создаёт «скрытые» зависимости и затрудняет навигацию в IDE.

Частые вопросы на собеседовании

  • В чём различия между value types и reference types в C#?
  • В чём разница между IEnumerable<T> и IQueryable<T>?
  • Что такое LINQ? Приведите примеры часто используемых LINQ-операторов.
  • Как работает оператор lock и что такое deadlock?

Типичные ошибки

  • Путать extension methods и расширение API без наследования с похожим механизмом из другой версии или платформы.
  • Игнорировать runtime-границы C#: lifecycle, DI scope, SQL translation, UI thread или platform API.
  • Не обсуждать null/empty/error cases и поведение под нагрузкой.

Что проверяет интервьюер

  • Кандидат объясняет extension methods и расширение API без наследования на конкретном примере, а не только определением.
  • Указывает последствия для производительности, тестируемости и поддержки.
  • Различает документированное поведение текущего стека и устаревшие практики.

Как вы знаете этот вопрос?

Проверить себя по теме C# →

Источники

  • https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

Связанные темы

C#implementationruntime-reasoning

Вакансии с этим навыком

C# вакансии
  • .NET Fullstack Developer Senior / Tech Lead (EU Public)
  • Programista / Programistka C#/.NET
  • Automation Tester (C#/.NET)
  • Automation Tester Senior (C#, .Net, Playwright) (k/m/x)
  • Ingénieur DevOps / Azure DevOps