Что такое Signalr ?
Спросят с вероятностью 22%
SignalR — это библиотека, разработанная для облегчения добавления функциональности "реального времени" в веб-приложения. Она позволяет серверу автоматически отправлять обновления клиентам в режиме реального времени, не требуя от клиентов периодически опрашивать сервер на предмет изменений.
Ключевые особенности:
1️⃣Двусторонняя связь: В отличие от традиционного HTTP, который является односторонним (клиент отправляет запрос, сервер отправляет ответ), SignalR позволяет обоюдный обмен данными между клиентом и сервером в реальном времени.
2️⃣Абстракция транспорта: Автоматически выбирает наилучший доступный способ транспорта данных между клиентом и сервером в зависимости от возможностей клиентского устройства и сервера. Он поддерживает различные технологии, включая WebSockets, Server-Sent Events и Long Polling.
3️⃣Масштабируемость: Поддерживает масштабируемость веб-приложений через использование внешних компонентов, таких как Redis или Azure Service Bus, для управления подключениями через несколько серверов.
4️⃣Управление подключениями: Автоматически управляет подключениями, обработкой переподключений и обеспечивает групповую отправку сообщений, позволяя сообщениям быть отправленными к выбранным пользователям или группам.
SignalR широко используется в приложениях, где требуется мгновенное взаимодействие с пользователем. Например:
✅Чаты и коллаборативные платформы: Для обмена сообщениями в реальном времени.
✅Игры: Для обновления состояния игры у всех участников сессии.
✅Финансовые платформы: Для обновления финансовой информации, такой как котировки акций, в реальном времени.
✅Мониторинг и уведомления: Для отправки уведомлений или предупреждений пользователям.
На сервере (C#):
На клиенте (JavaScript):
Этот пример создает базовый чат, где сообщения отправляются в реальном времени всем подключенным клиентам через веб-сокеты, используя SignalR.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых
Спросят с вероятностью 22%
SignalR — это библиотека, разработанная для облегчения добавления функциональности "реального времени" в веб-приложения. Она позволяет серверу автоматически отправлять обновления клиентам в режиме реального времени, не требуя от клиентов периодически опрашивать сервер на предмет изменений.
Ключевые особенности:
1️⃣Двусторонняя связь: В отличие от традиционного HTTP, который является односторонним (клиент отправляет запрос, сервер отправляет ответ), SignalR позволяет обоюдный обмен данными между клиентом и сервером в реальном времени.
2️⃣Абстракция транспорта: Автоматически выбирает наилучший доступный способ транспорта данных между клиентом и сервером в зависимости от возможностей клиентского устройства и сервера. Он поддерживает различные технологии, включая WebSockets, Server-Sent Events и Long Polling.
3️⃣Масштабируемость: Поддерживает масштабируемость веб-приложений через использование внешних компонентов, таких как Redis или Azure Service Bus, для управления подключениями через несколько серверов.
4️⃣Управление подключениями: Автоматически управляет подключениями, обработкой переподключений и обеспечивает групповую отправку сообщений, позволяя сообщениям быть отправленными к выбранным пользователям или группам.
SignalR широко используется в приложениях, где требуется мгновенное взаимодействие с пользователем. Например:
✅Чаты и коллаборативные платформы: Для обмена сообщениями в реальном времени.
✅Игры: Для обновления состояния игры у всех участников сессии.
✅Финансовые платформы: Для обновления финансовой информации, такой как котировки акций, в реальном времени.
✅Мониторинг и уведомления: Для отправки уведомлений или предупреждений пользователям.
На сервере (C#):
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
На клиенте (JavaScript):
const connection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub")
.build();
connection.on("ReceiveMessage", function(user, message) {
const msg = message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
const encodedMsg = user + " says " + msg;
const li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
});
connection.start().catch(function(err) {
return console.error(err.toString());
});
document.getElementById("sendButton").addEventListener("click", function(event) {
const user = document.getElementById("userInput").value;
const message = document.getElementById("messageInput").value;
connection.invoke("SendMessage", user, message).catch(function(err) {
return console.error(err.toString());
});
event.preventDefault();
});
Этот пример создает базовый чат, где сообщения отправляются в реальном времени всем подключенным клиентам через веб-сокеты, используя SignalR.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Что такое интерфейс ?
Спросят с вероятностью 22%
"интерфейс" используется для описания различных концепций, в зависимости от контекста. Обычно относится к абстрактному типу, который определяет набор методов и свойств, которые классы должны реализовать, но не предоставляет реализацию этих методов.
Основные аспекты:
1️⃣Определение поведения: Интерфейс определяет "контракт" или спецификацию, которой должен следовать класс. Этот контракт включает методы и, иногда, свойства, которые реализующий класс обязан предоставить.
2️⃣Абстракция: Интерфейсы помогают отделить определение того, что класс должен делать, от деталей того, как класс выполняет эти задачи. Это позволяет разрабатывать программы, опираясь на абстракции, а не конкретные реализации.
3️⃣Множественное наследование: В языках, где классы не могут наследовать поведение нескольких классов напрямую (например, в C# и Java), интерфейсы предоставляют способ реализовать множественное наследование на уровне поведения.
4️⃣Интероперабельность: Интерфейсы облегчают взаимодействие различных частей программы или даже различных программ, поскольку они могут взаимодействовать через общий интерфейс, не заботясь о внутренних деталях каждого компонента.
В этом примере,
Использование интерфейсов позволяет создавать гибкие и масштабируемые приложения, где компоненты могут быть легко заменены или модифицированы без нарушения работы других частей программы. Они также способствуют созданию чистого и организованного кода, который легче поддерживать и расширять.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых
Спросят с вероятностью 22%
"интерфейс" используется для описания различных концепций, в зависимости от контекста. Обычно относится к абстрактному типу, который определяет набор методов и свойств, которые классы должны реализовать, но не предоставляет реализацию этих методов.
Основные аспекты:
1️⃣Определение поведения: Интерфейс определяет "контракт" или спецификацию, которой должен следовать класс. Этот контракт включает методы и, иногда, свойства, которые реализующий класс обязан предоставить.
2️⃣Абстракция: Интерфейсы помогают отделить определение того, что класс должен делать, от деталей того, как класс выполняет эти задачи. Это позволяет разрабатывать программы, опираясь на абстракции, а не конкретные реализации.
3️⃣Множественное наследование: В языках, где классы не могут наследовать поведение нескольких классов напрямую (например, в C# и Java), интерфейсы предоставляют способ реализовать множественное наследование на уровне поведения.
4️⃣Интероперабельность: Интерфейсы облегчают взаимодействие различных частей программы или даже различных программ, поскольку они могут взаимодействовать через общий интерфейс, не заботясь о внутренних деталях каждого компонента.
public interface IAnimal
{
void Eat();
void Move();
}
public class Dog : IAnimal
{
public void Eat()
{
Console.WriteLine("Dog is eating.");
}
public void Move()
{
Console.WriteLine("Dog is running.");
}
}
В этом примере,
IAnimal — это интерфейс с методами Eat и Move. Класс Dog реализует интерфейс IAnimal, предоставляя конкретную реализацию для каждого из методов интерфейса.Использование интерфейсов позволяет создавать гибкие и масштабируемые приложения, где компоненты могут быть легко заменены или модифицированы без нарушения работы других частей программы. Они также способствуют созданию чистого и организованного кода, который легче поддерживать и расширять.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1👾1
Anonymous Quiz
14%
Классы атрибутов наследуются от System.Attribute
14%
Атрибуты могут быть использованы для добавления метаданных к типам, методам и параметрам
22%
Атрибуты могут быть наследуемыми и многократно применимыми
50%
Атрибуты могут изменять компиляцию исходного кода
Конкурентные коллекции в C# — это специализированные коллекции, которые обеспечивают безопасное выполнение операций в многопоточной среде. В стандартной библиотеке .NET существуют несколько типов таких коллекций, каждая из которых предназначена для различных сценариев использования. Давайте рассмотрим основные из них.
Это словарь, который позволяет безопасно добавлять, удалять и изменять элементы из нескольких потоков одновременно. Он реализует интерфейс
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
}
Это очередь, которая обеспечивает безопасное добавление элементов в конец и извлечение из начала в многопоточной среде. Она реализует интерфейс
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
}
Это стек, который обеспечивает безопасное добавление и извлечение элементов в многопоточной среде. Он также реализует интерфейс
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
}
Это коллекция, которая позволяет безопасно добавлять и извлекать элементы в многопоточной среде. Она не гарантирует порядок элементов, поэтому используется в случаях, когда порядок не имеет значения.
Пример:
var concurrentBag = new ConcurrentBag<int>();
concurrentBag.Add(1);
concurrentBag.Add(2);
int result;
if (concurrentBag.TryTake(out result))
{
Console.WriteLine(result); // Output: 1 или 2
}
Это коллекция, которая поддерживает ограниченную емкость и блокировку потоков при добавлении или извлечении элементов. Она особенно полезна для реализации паттернов продюсер-потребитель.
Пример:
var blockingCollection = new BlockingCollection<int>(boundedCapacity: 5);
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
blockingCollection.Add(i);
Console.WriteLine($"Added {i}");
}
blockingCollection.CompleteAdding();
});
foreach (var item in blockingCollection.GetConsumingEnumerable())
{
Console.WriteLine($"Consumed {item}");
}
Заключение:
Конкурентные коллекции в C# обеспечивают безопасное взаимодействие между потоками при работе с общими данными. Они помогают избежать проблем синхронизации и повышают производительность многопоточных приложений за счет оптимизированных алгоритмов управления доступом к элементам коллекций.
Кратко:
Конкурентные коллекции в C# позволяют безопасно работать с данными в многопоточной среде, избегая проблем с синхронизацией. Примеры включают
ConcurrentDictionary, ConcurrentQueue, ConcurrentStack, ConcurrentBag и BlockingCollection.Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Anonymous Quiz
90%
MoveNext()
2%
MovePrevious()
3%
ResetCurrent()
6%
Advance()
Forwarded from Идущий к IT
10$ за техническое собеседование на английском языке:
1. Отправьте запись технического собеседования на английском языке файлом на этот аккаунт
2. Добавьте ссылку на вакансию или пришлите название компании и должность
3. Напишите номер кошелка USDT (Tether) на который отправить 10$
🛡 Важно:
– Запись будет использована только для сбора данных о вопросах
– Вы останетесь анонимны
– Запись нигде не будет опубликована
🤝 Условия:
– Внятный звук, различимая речь
– Допустимые профессии:
• Любые программисты
• DevOps
• Тестировщики
• Дата сайнтисты
• Бизнес/Системные аналитики
• Прожекты/Продукты
• UX/UI и продукт дизайнеры
1. Отправьте запись технического собеседования на английском языке файлом на этот аккаунт
2. Добавьте ссылку на вакансию или пришлите название компании и должность
3. Напишите номер кошелка USDT (Tether) на который отправить 10$
– Запись будет использована только для сбора данных о вопросах
– Вы останетесь анонимны
– Запись нигде не будет опубликована
– Внятный звук, различимая речь
– Допустимые профессии:
• Любые программисты
• DevOps
• Тестировщики
• Дата сайнтисты
• Бизнес/Системные аналитики
• Прожекты/Продукты
• UX/UI и продукт дизайнеры
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Групповые делегаты в C# представляют собой делегаты, которые могут содержать ссылки на несколько методов. Такие делегаты позволяют вызывать несколько методов последовательно в рамках одного вызова делегата. Это часто используется для событий и обратных вызовов (callbacks).
1. Делегат — это тип, который представляет ссылку на метод с определенной сигнатурой.
2. Групповой делегат — это делегат, который содержит ссылки на несколько методов и вызывает их по очереди.
Объединение делегатов.
Чтобы создать групповой делегат, нужно объединить несколько делегатов с помощью оператора
+ или метода Delegate.Combine.Пример:
using System;
public delegate void MyDelegate();
public class Program
{
public static void Method1()
{
Console.WriteLine("Method1");
}
public static void Method2()
{
Console.WriteLine("Method2");
}
public static void Main()
{
MyDelegate del1 = Method1;
MyDelegate del2 = Method2;
// Объединяем делегаты
MyDelegate groupDel = del1 + del2;
// Вызов группового делегата
groupDel();
}
}
Вывод:
Method1
Method2
Удаление делегатов.
Для удаления метода из группового делегата используется оператор
- или метод Delegate.Remove.Пример:
using System;
public delegate void MyDelegate();
public class Program
{
public static void Method1()
{
Console.WriteLine("Method1");
}
public static void Method2()
{
Console.WriteLine("Method2");
}
public static void Main()
{
MyDelegate del1 = Method1;
MyDelegate del2 = Method2;
// Объединяем делегаты
MyDelegate groupDel = del1 + del2;
// Удаляем делегат
groupDel -= del1;
// Вызов группового делегата
groupDel();
}
}
Вывод:
Method2
Групповые делегаты особенно полезны при работе с событиями, где несколько подписчиков могут быть уведомлены об одном и том же событии.
Пример:
using System;
public delegate void Notify(); // делегат для события
public class ProcessBusinessLogic
{
public event Notify ProcessCompleted; // событие
public void StartProcess()
{
Console.WriteLine("Process Started!");
// Какое-то логика процесса...
OnProcessCompleted();
}
protected virtual void OnProcessCompleted()
{
// Если есть подписчики
if (ProcessCompleted != null)
ProcessCompleted.Invoke();
}
}
public class Program
{
public static void Main()
{
ProcessBusinessLogic bl = new ProcessBusinessLogic();
bl.ProcessCompleted += bl_ProcessCompleted; // подписка на событие
bl.ProcessCompleted += bl_ProcessCompleted2; // подписка на событие
bl.StartProcess();
}
public static void bl_ProcessCompleted()
{
Console.WriteLine("Process Completed!");
}
public static void bl_ProcessCompleted2()
{
Console.WriteLine("Process Completed Again!");
}
}
Вывод:
Process Started!
Process Completed!
Process Completed Again!
Заключение:
Групповые делегаты в C# позволяют объединять несколько методов в один делегат и вызывать их последовательно. Они часто используются в событиях для уведомления нескольких подписчиков.
Кратко:
Групповые делегаты в C# позволяют объединять несколько методов в один делегат и вызывать их последовательно. Это полезно для уведомления нескольких подписчиков в событиях.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🎉1
Inversion of Control (IoC) и Dependency Injection (DI) — это два тесно связанных принципа, используемых для уменьшения зависимостей между компонентами программного обеспечения, что упрощает управление этими зависимостями, их тестирование и поддержку.
Это принцип программирования, при котором управление потоком программы передаётся из пользовательского кода во внешнюю библиотеку или фреймворк. В традиционном программировании пользовательский код, который вы пишете, вызывает библиотеки, когда нуждается в выполнении какой-либо функциональности. При использовании IoC библиотека вызывает ваш код. Это обеспечивает большую гибкость и упрощает расширение функциональности и тестирование, так как уменьшает зависимость кода от конкретной реализации задач.
IoC часто реализуется с помощью таких паттернов, как Dependency Injection, Event, Strategy.
Это конкретный способ реализации IoC, при котором создание объектов и управление их зависимостями не осуществляется самими объектами, а делегируется внешнему компоненту (например, IoC-контейнеру). Вместо того чтобы компоненты создавали нужные им зависимости самостоятельно, они получают их извне. Это позволяет сделать код более модульным, упрощает замену компонентов системы и их тестирование, поскольку зависимости можно легко подменять, например, моками (mock) в тестах.
Пример:
public interface ILogger
{
void Log(string message);
}
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine(message);
}
}
public class Application
{
private readonly ILogger _logger;
// Внедрение зависимости через конструктор
public Application(ILogger logger)
{
_logger = logger;
}
public void Run()
{
_logger.Log("Приложение запущено");
}
}
// Где-то в другом месте приложения
ILogger logger = new ConsoleLogger();
Application app = new Application(logger);
app.Run();
В этом примере
Application зависит от абстракции ILogger. Вместо того чтобы создавать конкретный экземпляр ConsoleLogger внутри Application, мы передаём его через конструктор, что позволяет легко заменить реализацию логгера без изменения кода класса Application.IoC — это более широкий принцип проектирования, который гласит: не ваш код должен контролировать поток выполнения программы, а некая внешняя сущность. DI — это конкретный способ достижения IoC, когда зависимости объектов предоставляются извне, а не создаются самими объектами.
Инверсия управления — это когда ваш код не управляет потоком выполнения, а подчиняется внешнему "руководителю". Внедрение зависимостей — это когда ваш код не создает то, что ему нужно для работы сам, а получает это "снаружи".
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
LINQ (Language Integrated Query) — это компонент .NET Framework, который добавляет возможности запроса данных из различных источников (таких как коллекции, базы данных, XML и другие) прямо в код C#. LINQ обеспечивает единообразный способ работы с данными, позволяя использовать одни и те же методы для различных типов данных. Вот основные преимущества LINQ:
LINQ предоставляет единый и последовательный способ работы с данными, будь то массивы, списки, базы данных или XML. Это снижает необходимость изучения различных API для работы с разными источниками данных.
// Пример запроса к массиву
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
Запросы LINQ легко читаются и понимаются, так как они используют знакомые конструкты языка программирования. Это упрощает поддержку и развитие кода.
// Пример запроса к списку объектов
List<Person> people = GetPeopleList();
var adults = from person in people
where person.Age >= 18
select person;
LINQ предоставляет строгую проверку типов на этапе компиляции, что помогает избежать многих ошибок, связанных с неправильным использованием типов данных. Это делает код более надежным.
// Пример использования LINQ с типизированными данными
var adults = people.Where(p => p.Age >= 18);
LINQ позволяет легко составлять сложные запросы, которые могут включать сортировку, группировку и объединение данных. Это позволяет сосредоточиться на логике запроса, а не на низкоуровневых деталях его выполнения.
// Пример группировки данных с использованием LINQ
var groupedPeople = from person in people
group person by person.Age into ageGroup
select new { Age = ageGroup.Key, People = ageGroup };
LINQ поддерживает ленивые вычисления, что означает, что данные не извлекаются из источника до тех пор, пока это не потребуется. Это может существенно повысить производительность, особенно при работе с большими объемами данных.
// Пример ленивых вычислений
var query = people.Where(p => p.Age >= 18); // Запрос еще не выполнен
foreach (var person in query)
{
Console.WriteLine(person.Name); // Запрос выполняется здесь
}
LINQ работает с различными источниками данных, включая массивы, списки, базы данных (через LINQ to SQL или Entity Framework), XML и даже сторонние сервисы.
// Пример запроса к базе данных с использованием Entity Framework
using (var context = new MyDbContext())
{
var users = from user in context.Users
where user.IsActive
select user;
}
LINQ упрощает работу с данными, делая код более читабельным и типобезопасным, поддерживает различные источники данных и позволяет легко составлять сложные запросы. Это инструмент, который помогает программистам писать более понятный, поддерживаемый и эффективный код.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Anonymous Quiz
1%
public
10%
private
15%
protected
74%
internal
👍4
Garbage Collector (GC) — это механизм управления памятью в среде выполнения .NET, который автоматически освобождает память, занимаемую объектами, которые больше не используются приложением. Это важная часть управления ресурсами в .NET, так как она предотвращает утечки памяти и улучшает общую производительность приложения. Вот основные аспекты работы Garbage Collector и его преимущества:
GC автоматически отслеживает объекты, создаваемые в управляемой куче (managed heap), и освобождает память, занимаемую объектами, которые больше не достижимы или не используются приложением. Это снижает необходимость ручного управления памятью и уменьшает вероятность утечек памяти.
GC выполняет сборку мусора (garbage collection) в несколько этапов:
Объекты в управляемой куче делятся на поколения (Generation):
Такое разделение помогает оптимизировать производительность сборки мусора, так как более молодые объекты имеют большую вероятность стать недостижимыми быстрее, чем старые.
.NET GC поддерживает сборку мусора в фоновом режиме, что позволяет минимизировать паузы в работе приложения за счет выполнения сборки мусора параллельно с основной работой приложения.
Программисты могут сосредоточиться на логике приложения, не заботясь о ручном управлении памятью, что упрощает разработку и снижает вероятность ошибок.
GC автоматически освобождает память, занимаемую недостижимыми объектами, что помогает предотвратить утечки памяти, которые могут привести к снижению производительности и нестабильности приложения.
GC периодически выполняет компактирование памяти, что снижает фрагментацию и улучшает производительность приложения.
Рассмотрим пример создания объектов в C# и как GC их обрабатывает:
class Program
{
static void Main()
{
// Создание объектов
for (int i = 0; i < 100; i++)
{
MyClass obj = new MyClass();
}
// Вызов сборки мусора вручную (обычно не рекомендуется)
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
class MyClass
{
~MyClass()
{
// Финализатор, который вызывается перед удалением объекта
Console.WriteLine("Объект удален");
}
}
В этом примере создается 100 объектов класса
MyClass. Когда они выходят из области видимости, GC может освободить память, занимаемую этими объектами.Garbage Collector автоматически управляет памятью, освобождая память, занимаемую неиспользуемыми объектами. Это упрощает разработку, предотвращает утечки памяти и улучшает производительность приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Anonymous Quiz
94%
async
4%
await
1%
asyncronous
0%
parallel
👍2
Anonymous Quiz
9%
Создаёт новую ссылку на объект
86%
Передаёт значение по ссылке
3%
Возвращает значение из метода
2%
Защищает переменную от изменений
❤1👾1
В C# ключевые слова
ref и out используются для передачи аргументов по ссылке, что позволяет методам изменять значения этих аргументов. Эти механизмы полезны как для значимых типов (структур), так и для ссылочных типов (объектов). Давайте рассмотрим более детально, зачем и как их используют для ссылочных типов.ref можно передавать ссылочные типы таким образом, чтобы метод мог изменять саму ссылку, то есть ссылаться на другой объект.out позволяет передавать аргумент, который не обязательно должен быть инициализирован до вызова метода. Метод, принимающий out аргумент, обязан присвоить ему значение до завершения работы.class Program
{
static void ChangeReference(ref MyClass obj)
{
obj = new MyClass { Value = 20 };
}
static void Main()
{
MyClass myObj = new MyClass { Value = 10 };
ChangeReference(ref myObj);
Console.WriteLine(myObj.Value); // Output: 20
}
}
class MyClass
{
public int Value { get; set; }
}
В этом примере
ref позволяет методу ChangeReference изменить ссылку myObj на новый объект MyClass.class Program
{
static void InitializeObject(out MyClass obj)
{
obj = new MyClass { Value = 30 };
}
static void Main()
{
MyClass myObj;
InitializeObject(out myObj);
Console.WriteLine(myObj.Value); // Output: 30
}
}
class MyClass
{
public int Value { get; set; }
}
В этом примере метод
InitializeObject использует out для создания и инициализации нового объекта MyClass.ref и out добавляют гибкости при работе с методами, позволяя им изменять ссылки на объекты или создавать и возвращать новые объекты.out полезен для методов, которые должны вернуть несколько значений или инициализировать объекты, которые не могут быть инициализированы заранее.ref и out используются для передачи объектов по ссылке, что позволяет методам изменять ссылки на объекты или инициализировать их. Это добавляет гибкости и позволяет оптимизировать работу с памятью.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Anonymous Quiz
3%
20%
System.Net
29%
System.Web
47%
System.Http
🤯6
В C# существует множество различных типов данных, которые можно разделить на две основные категории: значимые типы (value types) и ссылочные типы (reference types). Рассмотрим каждую из этих категорий и их подтипы.
Значимые типы хранят данные непосредственно в своей памяти. Они обычно располагаются в стеке и имеют фиксированный размер. К значимым типам относятся:
byte (8 бит)sbyte (8 бит)short (16 бит)ushort (16 бит)int (32 бита)uint (32 бита)long (64 бита)ulong (64 бита)float (32 бита)double (64 бита)decimal (128 бит)bool (1 бит, значения true или false)char (16 бит, символы в формате Unicode)struct Point { public int X; public int Y; }enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }null.int?, double?Ссылочные типы хранят ссылки на данные, которые размещаются в куче. К ссылочным типам относятся:
class Person { public string Name; public int Age; }interface IMovable { void Move(); }int[] numbers = new int[5];delegate void Process(int value);string message = "Hello, World!";record Person(string Name, int Age);int a = 5;
float b = 3.14f;
bool isTrue = true;
char letter = 'A';
string message = "Hello, World!";
Person person = new Person { Name = "Alice", Age = 30 };
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
Типы данных в C# делятся на значимые и ссылочные. Значимые типы хранят данные непосредственно, а ссылочные типы хранят ссылки на данные в памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Сборка мусора (Garbage Collection, GC) в C# — это автоматический процесс управления памятью, который освобождает память, занятую объектами, которые больше не используются приложением. Этот механизм помогает разработчикам избежать ошибок, связанных с управлением памятью вручную, таких как утечки памяти и неправильное использование освобожденных ресурсов. Давайте рассмотрим концепцию сборки мусора в C# подробнее.
class Program
{
static void Main()
{
for (int i = 0; i < 1000; i++)
{
CreateObject();
}
// Явный вызов сборщика мусора (не рекомендуется для обычного использования)
GC.Collect();
}
static void CreateObject()
{
MyClass obj = new MyClass();
// Объект obj будет собран сборщиком мусора, когда он больше не будет использоваться
}
}
class MyClass
{
// Поля и методы класса
}
Сборка мусора в C# автоматически управляет памятью, освобождая её от объектов, которые больше не нужны. Она помечает используемые объекты и удаляет те, что не используются, что помогает избежать утечек памяти и ошибок управления памятью.
Please open Telegram to view this post
VIEW IN TELEGRAM
Полиморфизм в объектно-ориентированном программировании (ООП) — это способность объектов разного типа обрабатывать данные через единый интерфейс. В C# существует несколько видов полиморфизма, которые можно разделить на две основные категории: компиляторный (статический) полиморфизм и временный (динамический) полиморфизм. Рассмотрим каждый из них более подробно.
Этот тип полиморфизма определяется на этапе компиляции. К нему относятся:
class MathOperations
{
public int Add(int a, int b)
{
return a + b;
}
public double Add(double a, double b)
{
return a + b;
}
}
class Complex
{
public double Real { get; set; }
public double Imaginary { get; set; }
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex { Real = c1.Real + c2.Real, Imaginary = c1.Imaginary + c2.Imaginary };
}
}
Этот тип полиморфизма определяется на этапе выполнения программы. К нему относятся:
virtual в базовом классе и override в производном классе.class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("Animal sound");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Bark");
}
}
interface IShape
{
void Draw();
}
class Circle : IShape
{
public void Draw()
{
Console.WriteLine("Drawing Circle");
}
}
class Square : IShape
{
public void Draw()
{
Console.WriteLine("Drawing Square");
}
}
class Printer
{
public void Print(string message)
{
Console.WriteLine(message);
}
public void Print(int number)
{
Console.WriteLine(number);
}
}
class Program
{
static void Main()
{
Printer printer = new Printer();
printer.Print("Hello, world!");
printer.Print(123);
}
}
class Program
{
static void Main()
{
Animal myDog = new Dog();
myDog.MakeSound(); // Output: Bark
}
}
class Program
{
static void Main()
{
IShape circle = new Circle();
IShape square = new Square();
circle.Draw(); // Output: Drawing Circle
square.Draw(); // Output: Drawing Square
}
}
Полиморфизм в C# бывает двух видов: статический и динамический. Статический включает перегрузку методов и операторов, а динамический включает переопределение методов и использование интерфейсов. Полиморфизм позволяет использовать единый интерфейс для работы с объектами разных типов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3🤔1
Принципы SOLID — это пять основных принципов объектно-ориентированного проектирования и программирования, которые помогают создавать гибкие и поддерживаемые системы:
Пример:
public class Report
{
public string Text { get; set; }
public void PrintReport()
{
// Логика печати отчета
}
}
public class ReportSaver
{
public void SaveToFile(Report report, string filePath)
{
// Логика сохранения отчета в файл
}
}
Пример:
public abstract class Shape
{
public abstract double Area();
}
public class Circle : Shape
{
public double Radius { get; set; }
public override double Area()
{
return Math.PI * Radius * Radius;
}
}
public class Square : Shape
{
public double Side { get; set; }
public override double Area()
{
return Side * Side;
}
}
Пример:
public class Bird
{
public virtual void Fly()
{
// Логика полета
}
}
public class Sparrow : Bird
{
public override void Fly()
{
// Логика полета воробья
}
}
public class Ostrich : Bird
{
public override void Fly()
{
throw new NotImplementedException();
}
}
Здесь принцип нарушен, так как страус не может летать. Лучше не наследовать страуса от класса Bird, если метод Fly не применим ко всем подклассам.
Пример:
public interface IPrinter
{
void Print();
}
public interface IScanner
{
void Scan();
}
public class MultiFunctionPrinter : IPrinter, IScanner
{
public void Print()
{
// Логика печати
}
public void Scan()
{
// Логика сканирования
}
}
public class SimplePrinter : IPrinter
{
public void Print()
{
// Логика печати
}
}
Пример:
public interface IMessageSender
{
void SendMessage(string message);
}
public class EmailSender : IMessageSender
{
public void SendMessage(string message)
{
// Логика отправки email
}
}
public class Notification
{
private readonly IMessageSender _messageSender;
public Notification(IMessageSender messageSender)
{
_messageSender = messageSender;
}
public void Send(string message)
{
_messageSender.SendMessage(message);
}
}
Принципы SOLID помогают создавать гибкие и поддерживаемые системы. Это принципы единственной ответственности, открытости/закрытости, подстановки Лисков, разделения интерфейса и инверсии зависимостей. Они направлены на улучшение структуры и качества кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤯1
Микросервисная архитектура предлагает множество преимуществ, таких как независимая разработка и развёртывание компонентов, повышенная масштабируемость и устойчивость к сбоям. Однако, несмотря на все эти плюсы, существуют и некоторые недостатки, которые необходимо учитывать при принятии решения о переходе на микросервисную архитектуру.
Описание:
Проблемы:
Описание:
Проблемы:
Описание:
Проблемы:
Описание:
Проблемы:
Описание:
Проблемы:
Описание:
Проблемы:
Предположим, у нас есть система микросервисов для интернет-магазина. Один микросервис отвечает за управление товарами, другой за обработку заказов, а третий за платежи. В монолитной архитектуре все компоненты находятся в одном приложении, и взаимодействие между ними происходит напрямую через вызовы методов. В микросервисной архитектуре взаимодействие будет происходить через сетевые запросы.
Микросервисная архитектура может усложнить управление системой, увеличить сетевые задержки, усложнить тестирование и поддержание консистентности данных, повысить требования к инфраструктуре и создать организационные сложности.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3