Ответы пользователя по тегу C#
  • Как программным методом удалить одну из итераций цикла for?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Можно добавить ещё 1 вложенный цикл, чтобы человек повторно вводил слово, пока не введёт уникальное.
    Это будет самый оптимальный вариант, как мне кажется.
    Ответ написан
  • Ref, out and in объяснение?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Нет никакого "лучше". Есть только то, для чего они предназначены и об этом подробно говорится в документации.

    0. Каждый из этих модификаторов имеет разные смыслы в зависимости от контекста.
    1. ref struct - запрещает боксить структуру и вообще как-либо иначе заносить в кучу.
    2. in (в женериках) - обозначает, что параметр контрвариантный (загугли)
    3. out (в женериках) - обозначает, что параметр инвариантный (тоже загугли)
    4. in/ref/out как модификатор аргументов методов - указывают, что передаваться будет ссылка (например на переменную).
    in - запрещает модификацию. out - обязывает инициализировать перед завершением метода. ref - никчему не обязывает.

    Из очевидных, но не ограничивающих сценариев использования (п4):
    1. in - для передачи больших структур, чтобы они не копировались.
    2. out - для TryParse
    3. ref - для Swap
    4. Ещё их всех можно использовать в P/Invoke для того же самого. Всякие нативные методы достаточно часто работают со ссылками.
    Ответ написан
  • Как понять строчку namespace System.Windows.Forms?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Не нужно путать неймспейсы из C# с модулями из других языков.
    Неймспейс проще всего воспринимать просто как приставку к названию всех типов, которые внутри неймспейса будут.
    А using - подсказка компилятору, чтобы он попробовал эту приставку добавить ко всем именам, которые он ещё не смог разрешить.
    Ответ написан
    Комментировать
  • Что делает атрибут [PreserveSig]?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. Это для работы с COM
    2. Если почитаешь подробную документацию на английском на prservesig, то всё поймёшь.
    COM методы возвращают hresult, который сообщает об успехе или ошибке.
    Проведение по умолчанию - всё что не успех преобразовывать в исключение.

    Preservesig сохраняет оригинальную сигнатуру и отдаёт hresult как есть, что может быть полезно, если ты хочешь как-то сам его проверить и обработать без выбрасывания исключений
    Ответ написан
    Комментировать
  • При сборке в visual studio выдаёт много ошибок. Возможно ли собрать это решение с github?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Этот проект написан на какой-то устаревшей версии .NET Framework.
    Чтобы избавиться от ошибок - тебе нужно выяснить, на какой именно и установить соответствующий devpack и ту версию Visual Studio, которая поддерживает эту версию .NET Framework.
    Ответ написан
    Комментировать
  • Можно ли упростить данный код (см. внутри), заменив ConcurrentBag list'ом и установив lock?

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


    1. Для каждого из файлов запусти по потоку (таске), каждый из которых пусть свой файл читает в поисках имеилов.
    2. Для записи в итоговый файл - заведи ещё 1 поток (таску).
    3. Коммуникацию между N читающими и 1 пишущим организуй через System.Threading.Channel

    Таким образом ты избавишься от ненужных блокировок и затрат на синхронизацию доступа к какому-то списку.

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

    UPD: тогда смотрим на количество данных.
    Если имеилов мало (по сравнению с количеством ОЗУ), то тогда можем прямо в памяти держать HashSet и проверять его в пишущем потоке.
    Если имеилов побольше - можем сделать HashSet не по самим и имеилам, а по их хешам.
    Если имеилов совсем много, то тогда можно записывать в отсортированную структуру данных на диск (двоичное дерево поиска например).

    UPD2:
    Для каждого из файлов запусти по потоку (таске), каждый из которых пусть свой файл читает в поисках имеилов.

    На самом деле можно попробовать запустить несколько потоков, разделив каждый файл ещё на N сегментов и назначив потокам эти сегменты. Плодить новые можно до тех пор, пока у тебя IO не кончится.
    Ответ написан
    1 комментарий
  • Существует ли аналог docxtemplater для .NET С#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Тоже не супер новая библиотека, но написано под netstandart https://github.com/UNIT6-open/TemplateEngine.Docx
    Ответ написан
    1 комментарий
  • Рестарт сервиса?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Кто-то же должен потом запустить сервис.
    Как мне кажется, проще будет реально через systemd или любую другую внешнюю систему это реализовать.
    Ответ написан
    3 комментария
  • Как правильно инициализировать библиотеку классов в .NET?

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

    Чтобы данный сервис был доступен в окружении Lib.Controls, я реализую в этой библиотеке статический класс:

    Фатальная ошибка.


    Является ли такая архитектура единственно возможной или у нее есть достойные альтернативы?

    Раз у тебя уже есть DI, то следующий шаг прямо напрашивается. Создавать формы тоже при помощи DI и прокидывать все такие зависимости через конструктор.
    Ответ написан
    2 комментария
  • Почему C# не кроссплатформенный?

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

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

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


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

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


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

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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Сделай из своего приложения службу. Службы запускаются в фоне и без окошка.
    Ответ написан
    Комментировать
  • Как сделать шаблонный метод для мат операций с числами и Типом Vector2?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Vector2 не реализует интерфейсы INumber и прочие новые => никак ты вокруг него женерик не сделаешь.
    Ответ написан
    Комментировать
  • Для кого операция добавления элемента в середину медленнее — для List или для LinkedList?

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

    Получается, что скорость равна?

    Нет, не равна.
    Как минимум из-за того что big O показывает только характеристику, с которой растёт время.

    Операция записи считается без чтения - в случае Linked List это значит, что мы пытаемся вставить, уже имея ссылку на нужный узел - нам не нужно тратить время на его поиск.

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

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

    Конкретные числа для конкретных случаев скажет только бенчмарк.
    Ответ написан
    Комментировать
  • Как проверять класс на null?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    public async Task<Country?> GetCountry(string countryCode, CancellationToken cancellationToken)
    {
        var countries = await SearchCountries("en-gb", cancellationToken);
        var country = countries.Value?.FirstOrDefault(x => string.Equals(x.Code, countryCode));
        return country; // всё ок - теперь типы сходятся.
    }
    Ответ написан
    Комментировать
  • Как прервать поток c#?

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

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

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

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

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

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

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

    "ПО для ПК" - это очень широкий набор и каждый из этих языков подходит, но для разных подмножеств.

    Или может лучше начать с C#, а дальше уже выучу C++?

    Если хочешь C++ - учи сразу C++.

    Надо ли учить Си?

    Если будешь писать на си.

    Подумал начать с C++

    Если хочешь потом с C++ перейти на что-то другое, то начинай с этого "чего-то другого".
    Ответ написан
    Комментировать
  • На сколько Java отличается в обозначении типизации от C# для понятия TS?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    У TS типизация структурная и там есть алгебраические типы данных, а у C#/Java номинативная и алгебраических типов данных нет (upd: хотя вроде в жаве есть enum class)
    Ответ написан
    3 комментария
  • Как создать установщик для свой OC на CosmOS?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Во время установки запускай какую-нибудь лёгкую версию ОС с флешки например, которая будет монтировать диск и записывать на него загрузчик с полноценным образом ос
    Ответ написан
    3 комментария
  • Почему net core потребляет много оперативной памяти?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    1. https://www.linuxatemyram.com/
    2. Особенности замера.

    Ну и 3:
    Даже если действительно на винде эта программа жрёт 11мб, а в докер-контейнере 200мб. Что это тебе даёт?
    Винда всё ещё будет отжирать минимум гиг, а линуксовое ядро будет болтаться около 100мб. И не забывай про п1 и 2
    Ответ написан