Веб-версияОткрыть в Telegram
CC# | Вопросы собесов

C# | Вопросы собесов

✅ Высокое доверие
@easy_c_sharp · канал · Технологии · в индексе с 2026-05-29
5 008подписчиков+7 за неделю
545средний охват поста
10.9%ER — охват к подписчикам
60постов за 30 дней
C
C# | Вопросы собесов
🤔 Что такое CancellationToken в многопоточности? CancellationToken — это объект, который позволяет управлять отменой операций, особенно асинхронных. Используется для: - Прерывания задач Task, async-await - Передачи сигнала отмены в долгоживущие процессы (загрузки, ожидания) - Контроля над временем жизни операции С помощью CancellationTokenSource можно отправить команду отмены, и все обработчики, использующие связанный токен, корректно завершат выполнение. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
593 ·
C# | Вопросы собесов
🤔 Может ли абстрактный метод быть вне абстрактного класса? Нет, абстрактный метод не может существовать вне абстрактного класса. В C# это ограничение встроено в язык, чтобы поддерживать строгую логику наследования и полиморфизма. 🚩Почему абстрактный метод требует абстрактного класса? Абстрактный метод — это метод, который объявлен, но не имеет реализации. Он выступает как "контракт", который обязан быть реализован в производном классе. public abstract class Shape { public abstract double CalculateArea(); } Абстрактные методы имеют следующие особенности: Они не могут содержать тело (реализацию). Их цель — заставить производные классы реализовать конкретную функциональность. Они всегда принадлежат абстрактным классам. 🚩Пример ошибки Если попытаться объявить абстрактный метод в обычном классе, компилятор выдаст ошибку public class RegularClass { public abstract void SomeMethod(); // Ошибка: абстрактный метод может быть только в абстрактном классе } 🚩Логика дизайна C# требует, чтобы абстрактные методы находились только в абстрактных классах, потому что: Абстрактные классы могут содержать как абстрактные, так и обычные методы. Это позволяет определять базовое поведение в абстрактном классе и оставлять специфическую реализацию производным классам. Обычные классы не могут содержать абстрактные методы, так как они предназначены для создания объектов, а объект не может содержать "незавершённый" метод. Ставь 👍 и забирай 📚 Базу знаний
658 ·
C
🤔 Есть прямоугольник и квадрат, цель вычислить площадь, что нарушает принцип Барбары Лисков? Если класс "Квадрат" наследуется от "Прямоугольник" и переопределяет методы установки ширины и высоты так, что нарушает их независимость, это ломает принцип Лисков. Например, изменение ширины у квадрата изменяет и высоту, что не ожидается для прямоугольника. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
624 ·
C# | Вопросы собесов
🤔 Интерполяция - это возможность использовать в строке переменные? Да, интерполяция строк — это удобный способ вставки значений переменных в строку без использования конкатенации (+) или String.Format(). Простой пример интерполяции строк string name = "Иван"; int age = 25; string message = $"Привет, меня зовут {name}, и мне {age} лет."; Console.WriteLine(message); Вывод Привет, меня зовут Иван, и мне 25 лет. 🚩Дополнительные возможности интерполяции 🟠Форматирование значений Можно форматировать числа и даты прямо в строке: double price = 99.99; DateTime today = DateTime.Now; string formatted = $"Цена: {price:C}, Дата: {today:dd.MM.yyyy}"; Console.WriteLine(formatted); Вывод Цена: 99,99 ₽, Дата: 01.03.2025 🟠Выполнение выражений Можно вставлять даже арифметические операции и вызовы методов: int a = 10, b = 5; string mathResult = $"Сумма: {a + b}, Разница: {a - b}"; Console.WriteLine(mathResult); Вывод Сумма: 15, Разница: 5 🟠Экранирование фигурных скобок Если нужно вывести {} в тексте, их надо удваивать: Console.WriteLine($"JSON: {{ \"name\": \"Иван\" }}"); Вывод JSON: { "name": "Иван" } Ставь 👍 и забирай 📚 Базу знаний
1 · 647 ·
C
🤔 Как можно использовать делегаты? Делегаты позволяют: - Передавать методы как параметры. - Создавать цепочки вызовов (мультикаст). - Реализовывать обратные вызовы (callback). - Использовать события и обработчики событий. - Организовывать стратегии поведения в шаблонах проектирования. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
2 · 649 ·
C# | Вопросы собесов
🤔 Строки - значимый или ссылочный тип? В C# строки (string) являются ссылочным типом, но ведут себя как значимый тип из-за своей неизменяемости (immutability). 🚩`string` – это ссылочный тип В C# все классы (class) – ссылочные типы, и string не исключение. - Переменная string хранит ссылку на объект в памяти, а не сам текст. - Две переменные могут ссылаться на один и тот же объект. string str1 = "Hello"; string str2 = str1; // str2 теперь указывает на тот же объект, что и str1 Console.WriteLine(object.ReferenceEquals(str1, str2)); // True 🚩`string` – неизменяемый тип (Immutable) Хотя string – ссылочный тип, каждое изменение строки создаёт новый объект в памяти, а не модифицирует существующий. string str = "Hello"; str += " World"; // Создаётся новый объект в памяти 🚩Почему `string` ведёт себя как значимый тип? Неизменяемость (Immutability) – строка не меняется после создания. Операции со строками создают новые объекты (как копирование значимых типов). Сравнение строк по значению (==), а не по ссылке (как у ссылочных типов). 1210 string s1 = "hello"; string s2 = "hello"; Console.WriteLine(s1 == s2); // True (сравниваются значения, а не ссылки) Ставь 👍 и забирай 📚 Базу знаний
1 · 648 ·
C
🤔 Что такое принцип подстановки Барбары Лисков? Принцип подстановки Лисков (LSP) гласит, что объект производного класса должен быть взаимозаменяем с объектом базового класса без нарушения корректности программы. 1. Наследники не должны изменять поведение, ожидаемое от базового класса. 2. Нарушение LSP приводит к труднообнаруживаемым ошибкам и нарушению принципов SOLID. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
2 · 572 ·
C# | Вопросы собесов
🤔 Что такое Dispose? Dispose метод является частью паттерна управления ресурсами, известного как "Dispose Pattern". Этот метод реализуется в классах через интерфейс IDisposable. Цель — явное освобождение неуправляемых ресурсов и, по желанию, управляемых ресурсов, прежде чем сборщик мусора освободит объект. Это важно для эффективного управления памятью и другими системными ресурсами. 🚩Неуправляемые и управляемые ресурсы 🟠Неуправляемые ресурсы включают в себя ресурсы, которые не управляются средой CLR (Common Language Runtime), например, файловые дескрипторы, сетевые соединения или указатели на память, выделенную вне .NET среды. 🟠Управляемые ресурсы это объекты .NET, которые занимают память и потенциально удерживают ссылки на неуправляемые ресурсы. 🚩Как он работает Должен освобождать все неуправляемые ресурсы, занимаемые объектом, а также должен иметь возможность освобождать управляемые ресурсы, если это необходимо. Как правило, управляемые ресурсы освобождаются сами сборщиком мусора, но если управляемый ресурс включает в себя неуправляемые ресурсы, тогда Dispose может быть вызван для их явного освобождения. public class ResourceHolder : IDisposable { private bool disposed = false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { // Освобождение управляемых ресурсов } // Освобождение неуправляемых ресурсов disposed = true; } } ~ResourceHolder() { Dispose(false); } } Пример использования Dispose using (var resource = new ResourceHolder()) { // Использование ресурса } // Метод Dispose автоматически вызывается при выходе из блока using Ставь 👍 и забирай 📚 Базу знаний
3 · 554 ·
C
🤔 В качестве ключа могут использоваться одинаковые значения? В Dictionary ключи должны быть уникальными. Если попытаться добавить второй раз ключ с тем же значением — произойдёт исключение. Значения (value) при этом могут повторяться, ограничение касается только ключей. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
1 · 510 ·
C# | Вопросы собесов
🤔 Можно ли generic методы использовать не в generic классах? Да, можно! Обобщённые (generic) методы могут существовать в обычных (не-generic) классах. 🚩Как это работает? Generic-метод — это метод, у которого тип параметра задаётся при вызове, даже если сам класс не является обобщённым. Пример: Обобщённый метод в обычном классе public class Utils { public static void Print<T>(T value) // Обобщённый метод { Console.WriteLine($"Тип: {typeof(T)}, Значение: {value}"); } } class Program { static void Main() { Utils.Print(100); // Тип: System.Int32, Значение: 100 Utils.Print("Hello"); // Тип: System.String, Значение: Hello Utils.Print(3.14); // Тип: System.Double, Значение: 3.14 } } Ставь 👍 и забирай 📚 Базу знаний
1 · 518 ·
C
🤔 Какие есть виды приведения типов? 1. Явное (explicit) — требует указания типа вручную. Может привести к ошибке времени выполнения. 2. Неявное (implicit) — происходит автоматически, когда не теряется информация. 3. Пользовательское (custom) — через оператор operator или as/is. 4. Boxing/Unboxing — упаковка значимых типов в объект и обратно. 5. Приведение интерфейсов/наследования — преобразование к базовому или интерфейсному типу. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
2 · 476 ·
C# | Вопросы собесов
🤔 Какая есть классификация у кучи? В информатике и программировании куча (heap) может классифицироваться по нескольким критериям. Рассмотрим основные виды: 🟠По назначению: Куча памяти (Memory Heap) Используется для динамического выделения памяти в приложениях. В C# это управляется сборщиком мусора (GC - Garbage Collector). Примеры: объекты, созданные с помощью new, выделяются в управляемой куче. 🟠Структура данных «Куча» (Heap Data Structure) Это специальная бинарная структура данных, используемая в алгоритмах, например, в сортировке (Heap Sort) или в приоритетных очередях. Бывает максимальная куча (max-heap) и минимальная куча (min-heap). 🚩По типу управления памятью (для кучи памяти в языках программирования): 🟠Управляемая куча (Managed Heap) В C# и .NET память выделяется и освобождается автоматически с помощью GC. Разделяется на поколения (Generation 0, 1, 2), что оптимизирует работу сборщика мусора. 🟠Неуправляемая куча (Unmanaged Heap) Применяется в C/C++ и низкоуровневом коде, где управление памятью выполняется вручную (malloc/free, new/delete). В C# тоже можно работать с ней через Marshal или Unsafe код. 🟠По структуре данных (Heap Data Structure): 🟠Максимальная куча (Max Heap) Корневой узел содержит наибольшее значение, а дочерние узлы – меньшее. Используется в алгоритмах приоритетных очередей. 🟠Минимальная куча (Min Heap) Корневой узел содержит наименьшее значение, а дочерние узлы – большее. Применяется в алгоритме Дейкстры и других задачах. using System; using System.Collections.Generic; class Program { static void Main() { PriorityQueue<int, int> minHeap = new PriorityQueue<int, int>(); minHeap.Enqueue(5, 5); minHeap.Enqueue(3, 3); minHeap.Enqueue(8, 8); minHeap.Enqueue(1, 1); while (minHeap.Count > 0) { Console.WriteLine(minHeap.Dequeue()); // Выведет: 1, 3, 5, 8 } } } Ставь 👍 и забирай 📚 Базу знаний
5 · 457 ·
C
🤔 Что занимает меньше памяти: класс или структура? Структура (значимый тип) занимает меньше памяти, потому что: - Хранится в стеке или внутри другого объекта, без дополнительной накладной информации. - Не требует хранения метаданных о типе, как у класса. - Не использует сборщик мусора (GC) для удаления. Однако слишком большие или часто копируемые структуры могут быть менее эффективны. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
450 ·
C# | Вопросы собесов
🤔 В каком случае использовать интерфейс, в каком абстрактный класс? Выбор между интерфейсом и абстрактным классом в C# зависит от нескольких факторов, таких как потребности в наследовании, степень общности, возможность множественного наследования и необходимость реализации по умолчанию. 🚩Когда использовать интерфейсы 🟠Множественное наследование Класс может реализовывать несколько интерфейсов, но наследоваться только от одного класса. Используйте интерфейсы, когда требуется множественное наследование. public interface IDriveable { void Drive(); } public interface IFlyable { void Fly(); } public class FlyingCar : IDriveable, IFlyable { public void Drive() { /* Реализация вождения */ } public void Fly() { /* Реализация полета */ } } 🟠Общее поведение без реализации Используйте интерфейсы, чтобы определить общий набор методов и свойств без предоставления какой-либо реализации. Это позволяет разным классам реализовать интерфейс по-своему. public interface IShape { double GetArea(); } public class Circle : IShape { public double Radius { get; set; } public double GetArea() => Math.PI * Radius * Radius; } public class Rectangle : IShape { public double Width { get; set; } public double Height { get; set; } public double GetArea() => Width * Height; } 🟠Гибкость и полиморфизм Интерфейсы позволяют легко менять реализацию и обеспечивают гибкость в коде. Можно использовать интерфейсы для создания полиморфных коллекций или методов, которые работают с разными реализациями интерфейсов. public void DrawShapes(IEnumerable<IShape> shapes) { foreach (var shape in shapes) { Console.WriteLine($"Area: {shape.GetArea()}"); } } 🚩Когда использовать 🟠Частичная реализация Используйте абстрактные классы, если вы хотите предоставить некоторую общую реализацию, которую могут использовать подклассы. Абстрактные классы могут содержать как абстрактные, так и не абстрактные методы. public abstract class Animal { public abstract void MakeSound(); public void Sleep() => Co
2 · 356 ·
C
🤔 В чём разница между var и dynamic? - var — тип определяется на этапе компиляции. После компиляции он получает конкретный тип. Статическая типизация. - dynamic — тип определяется во время выполнения. Ошибки типа могут проявиться только в рантайме. var безопаснее, dynamic гибче, но требует осторожности. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
371 ·
C# | Вопросы собесов
🤔 Как браузер отправляет запрос и получает ответ от API? Когда браузер отправляет запрос и получает ответ от API, это включает несколько шагов, которые следуют HTTP-протоколу. Этот процесс включает в себя создание и отправку HTTP-запроса, обработку на сервере и получение HTTP-ответа. 🚩Отправка запроса 🟠Инициация запроса Обычно запрос инициируется через JavaScript с использованием встроенных функций, таких как XMLHttpRequest, fetch или сторонние библиотеки, такие как Axios. fetch('https://api.example.com/data', { method: 'GET', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer token' } }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); 🟠Формирование HTTP-запроса Метод: Указывает тип запроса (например, GET, POST, PUT, DELETE). URL: Указывает на какой URL отправляется запрос. Заголовки (Headers): Включают информацию о типе содержимого, авторизации и других метаданных. Тело (Body): Содержит данные, которые отправляются с запросом (для методов POST, PUT и PATCH). 🟠Отправка запроса Браузер использует сетевые протоколы для отправки сформированного HTTP-запроса на указанный сервер через интернет. 🚩Обработка запроса на сервере 1⃣Получение запроса Сервер получает HTTP-запрос. 2⃣Обработка запроса Сервер обрабатывает запрос, выполняя соответствующие действия, такие как чтение данных из базы данных, выполнение логики приложения или взаимодействие с другими сервисами. 3⃣Формирование ответа Статус код (Status Code): Указывает результат обработки запроса (например, 200 OK, 404 Not Found, 500 Internal Server Error). Заголовки (Headers): Могут включать метаданные о содержимом ответа, кэшировании и других параметрах. Тело (Body): Содержит данные, которые отправляются обратно клиенту, часто в формате JSON или XML. HTTP/1.1 200 OK Content-Type: application/json Content-Length: 85 { "id": 1, "name":
1 · 335 ·
C
🤔 Что такое куки и где оно хранится в запросе? Это небольшие файлы данных, хранящиеся на стороне клиента и отправляемые серверу с каждым запросом. 1. Они содержатся в заголовке HTTP-запроса (Cookie). 2. Используются для хранения сессий, предпочтений пользователя и другой информации. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
354 ·
C# | Вопросы собесов
Фотография
нажмите — покажем
Авторизованные курсы по оборудованию Eltex от дилера №1 Проводим учебные курсы, включающие практические занятия и лабораторные работы. По итогу успешной сдачи экзаменов обучающемуся выдаётся официальный сертификат от завода Eltex. ⚡Обучение в офисе или онлайн ⚡Опытный преподавательский состав ⚡Лабораторные работы - 50% времени ⚡Обучение юридических и физических лиц Записаться #реклама 16+ eltexcm.ru О рекламодателе
316 ·
Фотография
нажмите — покажем
🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собеседование: Senior C# разработчик проведёт его в прямом эфире. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью. Как это будет: 📂 Собеседует Александр Моргунов — Senior C# разработчик, 7+ лет в европейских высоконагруженных сервисах. Отвечает разработчик-доброволец; 📂 Всё как на настоящем собесе: Александр задаёт те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает; 📂 После каждого ответа Александр даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе; 📂 В конце можно задать любой вопрос. Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир -> @shortcut_csharp_bot Реклама. О рекламодателе.
1 · 295 ·
🤔 Расскажи про конкурентные коллекции? Конкурентные коллекции — это специализированные коллекции, которые обеспечивают безопасное выполнение операций в многопоточной среде. В стандартной библиотеке .NET существуют несколько типов таких коллекций, каждая из которых предназначена для различных сценариев использования. Давайте рассмотрим основные из них. 🟠ConcurrentDictionary<TKey, TValue> Это словарь, который позволяет безопасно добавлять, удалять и изменять элементы из нескольких потоков одновременно. Он реализует интерфейс IDictionary<TKey, TValue>. var concurrentDictionary = new ConcurrentDictionary<int, string>(); concurrentDictionary.TryAdd(1, "value1"); concurrentDictionary.TryAdd(2, "value2"); string value; if (concurrentDictionary.TryGetValue(1, out value)) { Console.WriteLine(value); // Output: value1 } 🟠ConcurrentQueue<T> Это очередь, которая обеспечивает безопасное добавление элементов в конец и извлечение из начала в многопоточной среде. Она реализует интерфейс IProducerConsumerCollection<T>. var concurrentQueue = new ConcurrentQueue<int>(); concurrentQueue.Enqueue(1); concurrentQueue.Enqueue(2); int result; if (concurrentQueue.TryDequeue(out result)) { Console.WriteLine(result); // Output: 1 } 🟠ConcurrentStack<T> Это стек, который обеспечивает безопасное добавление и извлечение элементов в многопоточной среде. Он также реализует интерфейс IProducerConsumerCollection<T>. var concurrentStack = new ConcurrentStack<int>(); concurrentStack.Push(1); concurrentStack.Push(2); int result; if (concurrentStack.TryPop(out result)) { Console.WriteLine(result); // Output: 2 } 🟠ConcurrentBag<T> Это коллекция, которая позволяет безопасно добавлять и извлекать элементы в многопоточной среде. Она не гарантирует порядок элементов, поэтому используется в случаях, когда порядок не имеет значения. var concurrentBag = new ConcurrentBag<int>(); concurrentBag.Add(1); concurrentBag.Add(2); int result; if (concurrentBag.TryTake(out result)) { Console.Wr
1 · 249 ·
🤔 Для чего используют асинхронность? Асинхронность позволяет выполнять операции без блокировки основного потока, что особенно важно для долгих операций, таких как сетевые запросы или чтение/запись данных. 1. Улучшает отзывчивость пользовательского интерфейса. 2. Повышает производительность за счёт параллельного выполнения задач. 3. Экономит системные ресурсы, избегая создания лишних потоков. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
1 · 211 ·
C
Видео
tmpanai3yhg.mp4 · 31.7 МБ · нажмите — покажем
Бесплатный курс по дизайну в FIGMA от Yudaev School Онлайн-программа с наставником и чатом. Внимание! 80% практики. ✅По результату обучения у вас будет портфолио из нескольких работ. ✅Сертификат о прохождении курса. ✅Возможность пройти полное обучение и получить карьерное сопровождение! Учитесь дизайну у профессионалов в Yudaev Shool. Переходи по кнопки: "Подробнее" и начинай свое обучение. Доступ 0 руб. Узнать больше #реклама 16+ yudaevschool24.online О рекламодателе
332 ·
C# | Вопросы собесов
🤔 Что такое инверсия зависимостей? Инверсия зависимостей — это принцип SOLID, который говорит: > Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций. Это значит, что вместо жёстких зависимостей на конкретные классы, код должен работать через абстракции (interface или abstract class). 🚩Проблема без инверсии зависимостей Допустим, у нас есть класс EmailSender, который отправляет письма: public class EmailSender { public void Send(string message) { Console.WriteLine($"Отправка email: {message}"); } } public class NotificationService { private EmailSender _emailSender = new EmailSender(); public void Notify(string message) { _emailSender.Send(message); } } 🚩Решение: Инверсия зависимостей Чтобы избавиться от жёсткой зависимости, вводим абстракцию (IMessageSender): public interface IMessageSender { void Send(string message); } public class EmailSender : IMessageSender { public void Send(string message) { Console.WriteLine($"Отправка email: {message}"); } } public class SmsSender : IMessageSender { public void Send(string message) { Console.WriteLine($"Отправка SMS: {message}"); } } Теперь NotificationService зависит не от конкретного класса, а от интерфейса: public class NotificationService { private readonly IMessageSender _messageSender; public NotificationService(IMessageSender messageSender) { _messageSender = messageSender; } public void Notify(string message) { _messageSender.Send(message); } } Теперь мы можем подставлять любую реализацию IMessageSender: var emailNotifier = new NotificationService(new EmailSender()); emailNotifier.Notify("Привет через Email!"); var smsNotifier = new NotificationService(new SmsSender()); smsNotifier.Notify("Привет через SMS!"); Вывод Отправка email: Привет через Email! Отправка SMS: Привет через SMS! 🚩Преимущества инверсии з
286 ·
🤔 Какую проблему решает ThreadPool? ThreadPool (пул потоков) решает проблему частого создания и уничтожения потоков, которое дорого по ресурсам. Проблемы, которые он решает: - Производительность (не тратится время на создание потока) - Утилизация ресурсов - Масштабируемость при высокой нагрузке Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
276 ·
C
Фотография
нажмите — покажем
Аренда стойки под ваш сервер в ЦОД Cloud4Y Это решение для бизнеса, которому важны стабильность, контроль и безопасность ИТ-инфраструктуры. Кому подойдёт решение: • IT-компаниям, разработчикам ПО и SaaS-сервисов; • Системным интеграторам; • Организациям с чувствительными данными; • Бизнесу с действующими физическими серверами; • Компаниям, использующим лицензии, привязанные к «железу»; • Для резервного копирования и бэкап-серверов Что вы получаете: — Размещение оборудования в сертифицированном ЦОД (Tier III); — Круглосуточный доступ (физический и удалённый), охрана, система видеонаблюдения; — Резервированное электропитание и климат-контроль; — Аренда юнитов или всего стойко-места; — Техническая поддержка 24/7; — Поддержка при установке, консультации по подключению. Cloud4Y – инфраструктура, которой можно доверять. Узнать цену #реклама 16+ cloud4y.ru О рекламодателе
187 ·

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем