Ответы пользователя по тегу C#
  • Почему 0,5 округляется до чётного числа?

    igolets
    @igolets
    Программист C#, MSSQL
    Я когда-то даже написал на эту тему статью.

    https://habr.com/ru/articles/801899/
    Ответ написан
    Комментировать
  • Как сделать кнопку Инфо?

    igolets
    @igolets
    Программист C#, MSSQL
    Есть такой проект, FontAwesome, в основном его используют для веба, но есть библиотеки для десктопа. Например, вот https://awesome-inc.github.io/FontAwesome.Sharp/

    Эта библиотека предлагает свой набор контролов (появляется в тулбоксе в виде отдельной группы).
    Вот такое можно сделать:
    659fa5230f7f5417068805.png
    Ответ написан
    Комментировать
  • Что стоит учить с или c++ или c#?

    igolets
    @igolets
    Программист C#, MSSQL
    На C/C++ имеет смысл смотреть в случаях:
    1. Если есть в планах разрабатывать ПО, которое работает с железом на низком уровне.
    2. Если есть в планах разрабатывать высокопроизводительное ПО.
    3. Если есть в планах разрабатывать ультра-портируемое ПО.
    4. Если есть желание разобраться как ПО на любом другом языке переводится в машинный код и как его оптимизировать.

    В остальном эти языки требуют относительно высокой дисциплины от разработчика, т.к. предоставляют широкие возможности для доступа к железу/памяти (ошибок).

    Касательно C# — я бы сказал, что он похож скорее на Java, чем на C. Как минимум, внутренней логикой. Его хорошо использовать для разработки разного рода прикладного ПО, быстрой разработки, обучения — много готовых инструментов, прощает многие ошибки. Ещё для обучения хорош Pascal — его создавали специально для этих целей.

    Учить C# рекомендую по экзаменационным курсам Microsoft — в них довольно последовательное изложение, покрывающее все существенные темы. Для C# это "Exam Ref 70-483 Programming in C#" (сам экзамен отменён с 2021, но знания особо не устарели ;) книжку в виде PDF можно найти в поиске за пару минут).

    И ещё момент — в вопросе явно не было указана степень знакомства с темой, но от себя рекомендую уделить пристальное внимание структурам данных и алгоритмам. Без этих знаний преобразовать задачу в код будет очень сложно и больно от изобретаемых велосипедов.
    Ответ написан
    Комментировать
  • Какой хостинг выбрать для ТГ бота на .Net?

    igolets
    @igolets
    Программист C#, MSSQL
    Как опцию предлагаю рассмотреть бессерверный бот. До какого-то количества вызовов вообще будет бесплатно.
    https://habr.com/ru/articles/752658/
    Ответ написан
    Комментировать
  • Как к триггеру привязать делегат?

    igolets
    @igolets
    Программист C#, MSSQL
    Триггеры, к сожалению, напрямую не предназначены для вызова кода. Но код можно вызывать косвенно. Навскидку могу привести следующие варианты:
    1. DataTrigger может биндится через конвертер, соответственно, будет вызываться код конвертера с передачей данных из модели. Пример https://itecnote.com/tecnote/c-wpf-calling-method-...
    2. EventTrigger может запускать TriggerAction. Можно написать свой TriggerAction и этот код будет вызываться по триггеру. Пример https://putridparrot.com/blog/a-simple-wpf-trigger...
    3. Ну и по-простому можно триггером выставлять свойство контрола, а изменение свойства обрабатывать обработчиком.
    Ответ написан
    Комментировать
  • Стоит ли переписывать старый проект на .NET6 (на голом энтузиазме)?

    igolets
    @igolets
    Программист C#, MSSQL
    Я бы предложил попробовать скушать этого слона по частям, а не замахиваться на переписывание всего с сразу.
    По мере появления новых задач локально (в тех местах, которые уже затронуты изменениями) приводить код в порядок — добавлять асинхронность, приводить в порядок типы, обновлять библиотеки.
    Собственно, на .Net6 свет клином не сошёлся, плохой код (как и хороший) можно писать на любой версии
    Ответ написан
    Комментировать
  • Почему не могу добавить компонент в Win Form?

    igolets
    @igolets
    Программист C#, MSSQL
    Обычно контрол в панели появляется если открыт дизайнер подходящий (по версии .Net и т.п.).
    Ответ написан
    Комментировать
  • Имеет ли смысл использовать паттерн MVVM в приложении Winforms?

    igolets
    @igolets
    Программист C#, MSSQL
    1. WPF немного адаптирован для MVVM, но это не обязательно — масса примеров в родной документации не использует никакого MVVM. Так что я бы не связывал выбор использования MVVM с WPF.
    2. Есть готовые библиотеки для WinForms, которые умеют делать легкий MVVM. Лично я, например, работал с DevExpress и на мой взгляд, из коробки он дает даже больше, чем WPF (например, есть встроенные сервисы работы с попап окнами). Так что использовать MVVM на WinForms не сложнее, чем на WPF.
    3. И раз мы отделили вопрос MVVM от WPF/WF, нужно принципиально решать вопрос использовать ли MVVM в конкретном проекте.
    4. И, собственно, вопрос использование MVVM имеет плюсы и минусы. Плюсы — сопротивление хаосу при массированных изменениях кода, уменьшение человеческого труда при тестировании. Минусы — больше кодинга (накладные расходы на раздельную реализацию VM + юнит-тесты), не устраняет ручное тестирование до конца. Использовать MVVM без юнит-тестов смысла особо не вижу — кодить больше, выгоды никакой.


    Лично мое мнение — если нужна простая утилита «для себя», которую один раз написали и не трогают, я бы писал быстро (без MVVM и тестов). А если её будут менять, в том числе другие разработчики, а цена ошибки — деньги (например, если админятся данные клиентов по контрактам), то лучше MVVM и тесты.
    Ответ написан
    Комментировать
  • Как можно получать или ссылаться на переменные с двойным подчеркиванием при помощи sub classov?

    igolets
    @igolets
    Программист C#, MSSQL
    Вот статья по теме: https://learn.microsoft.com/en-us/aspnet/core/fund... Раздел "Environment variables".
    Там есть пример, ссылка на код (на GitHub) и вызов
    set MyKey="My key from Environment"
    set Position__Title=Environment_Editor
    set Position__Name=Environment_Rick
    dotnet run


    Собственно, под капотом следующее (тут сборная солянка, из разных классов):
    // из public class Startup
            public void ConfigureServices(IServiceCollection services)
            {
                services. Configure<PositionOptions>(Configuration.GetSection(
                                                    PositionOptions.Position));
                services.AddRazorPages();
            }
    
    // из кода, который обращается к настройкам
        public class PositionOptions
        {
            public const string Position = "Position";
    
            public string Title { get; set; }
            public string Name { get; set; }
        }
    
            public Test2Model(IOptions<PositionOptions> options)
            {
                _options = options.Value;
            }
    
            public ContentResult OnGet()
            {
                return Content($"Title: {_options.Title} \n" +
                               $"Name: {_options. Name}");
            }

    Т.е. в Вашем случае нужно:
    1. сделать класс ApiConfig (по образцу PositionOptions из примера выше)
    2. в Startup вызвать services. Configure, передав данные класса ApiConfig
    3. в коде, который дожен работать с ApiConfig запросить в конструкторе IOptions<ApiConfig>


    Второй вариант доступа такой:
    var title = Configuration["Position:Title"];
                var name = Configuration["Position:Name"];
    Ответ написан
    1 комментарий
  • Как запустить задачу меньше чем за 1 мс?

    igolets
    @igolets
    Программист C#, MSSQL
    Если есть задача запуска чего-то на настольном компе, то можно попробовать извернуться следующим образом:
    1. На C# написать прикладное ПО, которое взаимодействует с пользователем/БД/(нужное дописать)
    2. Через (например) USB/Serial port подключить плату с микроконтроллером
    3. На микроконтроллере (у него частота известна) запустить программу, которая, манипулируя NOPами, обеспечивает необходимые задержки. Точность, очевидно, будет очень высокая — половина такта процессора микроконтроллера (с учетом погрешности тактового генератора)
    4. Приложение на C# в нужные моменты посылает сигнал плате с микроконтроллером.


    В этом случае будут неизбежные задержки отправки сигнала плате из приложения на C# (по причинам, указанным выше), но сама плата будет выдавать гарантированную частоту. Человек задержки на стороне C# не заметит, а оборудование, которому шлёт сигналы микроконтроллер, будет получать комфортную частоту сигнала.

    Плату с микроконтроллером можно заменить на что-то, на чём запущена Realtime OS. Суть не сильно поменяется.
    Ответ написан
    Комментировать
  • Можете рекомендовать бесплатные ресурсы для изучение C#?

    igolets
    @igolets
    Программист C#, MSSQL
    1. Хорошо бы иметь базовое образование — знать, что такое алгоритмы и структуры данных. Знание другого языка программирования подойдет.
    2. На счёт книг — они по определению не бесплатны, кто-то вложил в них труд. Бесплатно — это либо читать документацию на сайте Microsoft, либо брать книгу у друзей/работодателя, или скачать украденное. Тут я рекламировать не буду, в принципе, для знакомства подойдет любая книга. Ещё есть ресурс https://docs.microsoft.com/ru-ru/learn/ (подробнее на https://habr.com/ru/company/microsoft/blog/426919/)
    3. Дальше нужно определиться с направлением работы (для чего нужен C#). Это может быть десктоп программирование, или веб, Azure и т.д. Тут могут потребоваться более специфичная литература. Я бы порекомендовал зайти на сайт https://docs.microsoft.com/en-us/certifications/browse/, выбрать интересующие направления и поискать (хотя бы и украденные) книжки по выбранным экзаменам, или MS Learn. Я как-то через сертификацию проходил, её преимущество в том, что дается довольно целостный и полный объем знаний. В том числе придется освоить темы, которые обычно пропускаешь, но которые могут быть важны для профессиональной разработки. Например, вопросы безопасности.
    Ответ написан
    Комментировать
  • Это оптимальный способ фильтрации записей из таблицы с помощью Entity Framework?

    igolets
    @igolets
    Программист C#, MSSQL
    Я как-то обычно пишу код чуть проще:
    var query = _dbContext.Products.AsQueryable();
                if (request.ProductGroups?.Length > 0)
                {
                    query = query.Where(x => request.ProductGroups.Any(y => y == x.ProductGroup));
                }
                if (request.SupplierIds?.Length > 0)
                {
                    query = query.Where(x => request.SupplierIds.Any(y => y == x.SupplierId));
                }
                if (request.Categories?.Length > 0)
                {
                    query = query.Where(x => request.Categories.Any( y => y == x.Category));
                }
    
    
                return Task.FromResult(_mapper.ProjectTo<ProductDto>(query));


    Общие замечания к коду:
    1. Есть ограничения по размеру запроса, если ProductGroups и Categories будут иметь длинные названия, могут быть исключения в рантайме
    2. Надо внимательно подумать на счёт ProductGroups и Categories и используемого движка БД — на предмет CaseSensitive и CaseInsensitive сравнений. Могут тоже быть приколы — когда запись из БД вернулась (там CaseInsensitive), а какой-то код на стороне C# не принял эту запись и упал (CaseSensitive).
    3. Соответственно, как предложение на подумать — нормализовать ProductGroups и Categories в отдельные таблицы ;)
    Ответ написан
    Комментировать
  • Как изменить дочерние значения в GroupBox?

    igolets
    @igolets
    Программист C#, MSSQL
    Label label1 — локальная переменная метода. Нужно её сделать полем класса и не создавать заново, если уже значение задано.

    void change(string first, string second, string third)
            {
                if(label1 == null)
                {
                    label1 = new Label();
                    groupBox1.Controls.Add(label1);
                }
                label1.Text = questions[current];
            }
    private Label label1 = null;
    Ответ написан
    Комментировать
  • Как пропарсить XML документ C#?

    igolets
    @igolets
    Программист C#, MSSQL
    Как я обычно с таким борюсь.

    1. Сделать (или взять у поставщика XML данных) файл со схемой XSD

    2. Из XSD сделать файл C# командами:
    xsd SourceFormat.xsd /c /n:NameSpace /o:tmp
    cd tmp
    ren SourceFormat.cs     SourceFormat.designer.cs
    move /y SourceFormat.designer.cs ..
    cd ..
    rd /s/q tmp


    (кратко что тут происходит — создается .cs файл в каталоге tmp, чтобы при ошибках не затереть исходник, потом .cs переименовываем в .designer.cs и помещаем в основной каталог)

    3. Оба файла (xsd и .designer.cs) можно добавить в проект, красиво отобразить второй как вложенный в первый

    4. Использовать упомянутый XmlSerializer для записи
    var serializer = new XmlSerializer ( typeof ( nmaprun ) );
                    using ( var writer = new StreamWriter ( xmlFileName ) ) )
                    {
                        serializer.Serialize ( writer, item );
                        writer.Close ();
                    }


    и для чтения

    using ( var temp = new StringReader ( xmlText ) )
                        {
                            var tmp = serializer.Deserialize ( temp );
                            return ( nmaprun ) tmp;
                        }
    Ответ написан
  • Как использовать в одном проекте разные версии nuget пакетов?

    igolets
    @igolets
    Программист C#, MSSQL
    Привет. По-хорошему, лучше сделать два проекта, запустить их в параллели и каким-то образом (через модный MessageBus, или каким-нибудь RESTful запросом) дергать второй процесс из первого.

    Но если очень хочется влоб, то могу посоветовать разве что покопать вот эту штуку: https://docs.microsoft.com/ru-ru/dotnet/api/system...
    Ещё важно будет учесть, что тут загружаемая ассембли грузится в домен приложения. Если в этом домене уже загружена та же ассембли другой версии могут быть накладки. Поэтому хорошо бы ещё поизучать тему доменов, вот тут, например https://docs.microsoft.com/ru-ru/dotnet/framework/...
    Я сам тему предметно не копал, изучал только в ходе подготовки к экзамену, но как я это понял, суть будет почти та же, что и первый вариант — по сути, из основного кода запускается второй поток в другом домене. Разница только в том, что можно попробовать сделать одно приложение, которое в себе содержит второе и умеет его запускать.
    Ответ написан
  • Обработать поток байт от USB CDC C#?

    igolets
    @igolets
    Программист C#, MSSQL
    1. Хорошо бы код, который работает с оборудованием (читает данные) вынести в отдельный класс и сделать под него интерфейс. Для чего нужно — если нужно будет разделить работу "железячника" и программиста интерфейса, второму можно будет дать возможность запускать программу с "заглушкой", чтобы он пилил интерфейс без доступа к железу. Ну, или для демонстрации программы запустить без доступа к железу.
    2. Соответственно, По событию на форме (старт/стоп) вызываются некие методы класса работы с железом и происходит получение/накопление данных. В зависимости от логики этого класса вызываются события (по получении байта, или полного пакета)
    3. По событию (код формы навесил обработчики событий при инициализации кода, работающего с железом) форма уже обращается к экземпляру класса, который работает с железом и получает от него данные (скорее всего, в сыром бинарном виде) и что-то с ними делает. Например, преобразует в класс-модельку, которая добавляется в биндингсорс (List), который используется как DataSource для ListView
    4. Код трансляции бинарных данных в модельку лучше тоже в отдельный класс вынести. Могу предположить, что могут быть разные формы представления данных.


    Вкратце так.

    Ну, а код класса имитации будет имитировать работу настоящего класса, вызывать нужные события и отдавать заранее записанные данные, или генерить по какому-то алгоритму. Переключение между заглушкой и настоящим классом реализуется, например, при помощи Dependency Injection, для C# можно использовать что-то типа https://habr.com/ru/post/50845/. В конфиг-файле прописывается, какой класс используется и всё, один и тот же код в рантайме использует разные классы. Лично я, например, так реализую работу с Фискальными аппаратами и терминалами оплаты пластиковыми картами.
    Ответ написан
    Комментировать
  • Как встроить embedded webserver в .NET Winforms приложение?

    igolets
    @igolets
    Программист C#, MSSQL
    Для .Net я бы посоветовал OWIN — https://docs.microsoft.com/en-us/aspnet/core/funda...

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

    Кстати, ASP.NET шаблоны сейчас активно используют owin.
    Ответ написан
    1 комментарий