• Автоматическая генерация классов на основе других классов?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Для C# это можно сделать 2 путями (без учета ручного создания):
    - Source Generators
    - Генерация IL кода (динамическая сборка)

    Лично я за 1 вариант, т.к. он будет быстрее в рантайме (все уже скомпилировано).
    Ответ написан
    2 комментария
  • Почему C# не кроссплатформенный?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист

    Почему C# не кроссплатформенный?

    На этот вопрос нельзя ответить сразу по двум причинам:
    1. C# - это язык, а язык не может быть кросс-платформенным, так как платформы в разрезе языка и нет.
    2. .NET уже много лет как кросс-платформенный.
    Начиная с уже мейнстримного .NET 8, заканчивая mono и всякой экзотикой типа nano framework


    но при этом, это не так

    Ничто нельзя запустить на "чём угодно"


    но в неё вопрос кроссплатформенности решена абсолютно полностью

    Если вопрос "абсолютно полностью" решён, то почему я не могу запускать программы, написанные на Java, на любом железе?
    Ответ написан
    Комментировать
  • Почему VSCode не создаёт блок Main при создании нового консольного приложения на C#?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Это называется Top Level Main - https://metanit.com/sharp/tutorial/1.4.php (начиная с C# 9)
    Кратко - нет смысла переделывать.
    Функциональность та же самая, разница только в том, что Main() генерируется компилятором, но преимущество - можно не заморачиваться над сигнатурой (например, можно влепить async/await и не менять void на async Task)
    Ответ написан
    Комментировать
  • Почему в C# через конструктор можно передать к базовому обьекту производный?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Но это не верно с точки зрения логики,

    Почему не верно? Конкретный тип всегда можно привести к базовому.
    Джон не человек? Кошка не животное?
    Вот наоборот уже нельзя: например нельзя People ob = new object(); - будет ошибка, тк object - слишком абстрактный тип.

    PS: чтобы не мучать отвечающего - лучше делай нормальные отступы в коде.
    Ответ написан
    2 комментария
  • Как прервать поток c#?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Раньше и всегда я делал, кучу говнокода, вставлял проверки на статус токена или булевой переменной.

    Да. Ты правильно делал. Это единственный дешевый пособ остановить поток не разрушив приложение.
    Единственное но. Если это численный метод и он вычисляет
    int[a][b][c][d]=Math.Pow(a*b*c*d,Math.Sqrt(Math.Sin(Math.Cos(Math.Sqrt(a-b/a)))))))*a+b;

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

    Практика показывает что частота 10-50 Гц является оптимальной для работы с пользователем.
    И нет смысла делать чаще. Ты все равно быстрее на кнопку не нажмешь.
    Ответ написан
    Комментировать
  • Как прервать поток c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Это вообще правильно?

    Да, это правильно и это по сути единственный адекватный способ отмены долгоиграющих операций.
    Когда-то давно у потоков был метод Abort, но его удалили, тк его использование очень часто приводило к неприятным багам.
    Ну и пихать проверку cancellation token повсюду не обязательно.
    Поток вызывает 1 функцию библиотечную неуправляемого кода, как ее прервать?

    Безопасно - никак, если эта неуправляемая функция не предоставляет интерфейс для отмены.
    Даже если бы и был способ (тот же Abort), то прерывание неуправляемого кода очень вероятно приведёт к утечке ресурсов (в лучшем случае не будет освобождена динамическая память)
    Ответ написан
    Комментировать
  • Как записать данные в .docx без Interop?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    NPOI и OpenXML Sdk
    Ответ написан
    Комментировать
  • Что за ошибка cs8053?

    GavriKos
    @GavriKos
    0. Погуглить
    1. Учить сишарп
    Ответ написан
    2 комментария
  • Что за ошибка cs8053?

    @OwDafuq
    Убрать = 1; и = 100;
    Присоединюсь к GavriKos - учить C#
    Ответ написан
    Комментировать
  • Как правильно хранить изображения в SQL и как правильно работать с ними в WPF проекте?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Идеальное решение без лишних рассуждений

    Картинки - в S3, а перед S3 поставить CDN, чтобы сильно S3 не нагружать.
    В центральную базу данных на сервере - только идентификаторы картинок.

    Клиент (на WPF) будет обращаться к какому-то приложению, которое написано на ASP NET Core, а оно, в свою очередь, будет идти в центральную БД за всякой инфой.

    Опционально - клиент будет идти в CDN за картинками.
    Сами картинки потом пусть кэшируются в ФС, чтобы не нужно было идти за ними повторно.
    Данные о модах тоже можно кэшировать, но уже в sqlite - это полезно будет, пока нет интернета, или пока актуальный список модов загружается.



    Да, единственный хороший вариант хранить картинки в базе - это не хранить картинки в базе, а хранить лишь пути или идентификаторы картинок.

    Главный минус картинок в ФС - это то что они будут привязаны к одному серверу. Лучше хранить картинки в другой системе (S3 или CDN) и хранить в базе их идентификаторы, чтобы потом клиент мог сам их скачать, если это необходимо. Так раздача картинок не будет привязана к основному серверу.

    А клиент пусть их кэширует также у себя на диске.

    В будущем я хотел бы попробовать сделать так, чтобы база была на каком-то сервере, чтобы многие могли пользоваться приложением, но не думаю, что это будет нормально работать, да и вообще не красиво( Заранее спасибо.

    Если ты хочешь, чтобы разные пользователи имели доступ к единой базе модов, то действительно надо сделать какой-то сервер.

    Ну и клиент на WPF не должен напрямую подключаться к MS SQL.
    MS SQL должен находится где-то на сервере и спрятан за каким-то другим web-сервером (который будет написан с использованием ASP NET Core например), который будет уже отвечать за всякую логику.
    Если тебе нужна локальная база данных на клиенте (для кэша например), то лучше использовать sqlite.
    Ответ написан
    2 комментария
  • От чего появляеться исключение System.IO.IOException: "The process cannot access the file '37.txt' because it is being used by another process."?

    Adler_lug
    @Adler_lug
    File.Create возвращает FileStream, т.е. он и держит файл открытым
    Ответ написан
    Комментировать
  • Как правильно и удобно читать данные из БД?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. async-await используй
    2. Используй какую-нибудь orm-ку (EF core, Dapper, linq2db). Многие из них как правило явно запрещают параллельные запросы в рамках одной транзакции.

    Но вроде чисто в теории sqlite разрешает конкурентное чтение (но не запись)
    Ответ написан
    Комментировать
  • Как получить текст из автоматически сгенерированных TextBox-ов?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Документация -> Learn / .NET / Обозреватель API / System.Windows.Controls / Grid -> Свойства -> Children: https://learn.microsoft.com/ru-ru/dotnet/api/syste...
    Ответ написан
    4 комментария
  • Почему CLR при генерации Машиного кода не оптимизирует циклы?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист

    еще заметил циклы не разматываются

    С чего взял? Вроде в core 3.1 добавили разматывание циклов.
    Но циклы разматываются очень редко, тк можно стек порвать

    Рекомендую посмотреть доклад от Егора Богатова: https://m.youtube.com/watch?v=H1ksFnLjLoY и статьи от него. Сейчас он работает в ms и как раз занимается jit-ом.

    Ещё можно задать какие-нибудь вопросы напрямую в чате https://t.me/pro_net
    Ответ написан
    Комментировать
  • Как можно инициализировать структуру в прямо в массиве в safe коде c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист

    То есть происходит лишние выделение на стеке память.

    Это на столько мизерное выделение, что я даже хз.

    Вообще структуры в массиве изначально уже созданы, но проинициализированы нулями - ты можешь сразу начать вызывать какие-то методы у них (которые, например, проинициализируют их)
    Ответ написан
    Комментировать
  • Где можно посмотреть реализацию готовых и профессиональных WebAPI в связке с клиентом?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Microsoft создал референсный микросервисный проект - eShopOnContainers. Там есть основные паттерны проектирования, клиенты различные (ajax, mvc).

    А вообще, это только часть общего репозитория с проектами под различные кейсы - dotnet-architecture

    Если есть время, то можно и книгу прочитать по этой архитектуре
    Ответ написан
    Комментировать
  • Как работать с ArrayPool, Откуда утечки?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Так в этом же и суть пула: выделить много памяти один раз и переиспользовать её много раз.
    Тем более что ты взял Shared пул, а не создал новый - вот он и не освобождает память
    Ответ написан
    Комментировать
  • Как проверить в списке элементов типа string наличие двух одинаковых строк?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Используй HashSet. Если при Add вернет true - значит есть дубликат
    Ответ написан
    Комментировать
  • Как проверить в списке элементов типа string наличие двух одинаковых строк?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Под капотом в любом случае всё упрётся в цикл.

    Если просто синтаксический не хочешь видеть цикл, то .Distinct().Count() и сравни с длиной исходного списка.

    Но по хорошему лучше пойти путём AshBlade

    И вообще если обязательна уникальность элементов - изначально работать с HashSet, а не List
    Ответ написан
    2 комментария
  • Как записать названия папок в массив?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Есть: применить к каждому возвращенному имени папки функцию (статический метод) Path.GetRelativePath и записать результаты в новый массив. Короче всего это записать через LINQ, примерно так:
    String[] rel_folder_names = Directory.GetDirectories(RootFolder).Select(s=>Path.GetRelativePath(RootFolder,s)).ToArray();

    Но если пока не умеете или боитесь использовать LINQ, то можно это сделать в обычном цикле
    String[] full_folder_names=Directory.GetDirectories(RootFolder);
    String[] rel_folder_names = new String[](full_folder_names.Length);
    for(int i=0;i<full_folder_names.Length;i++) {
         rel_folder_names[i]=Path.GetRelativePath(RootFolder,full_folder_names[i]);
    }

    Как-то так.

    PS Весь код написан "из головы", так что ошибки могут быть.
    Ответ написан
    4 комментария