Задать вопрос
Ответы пользователя по тегу C#
  • Является ли хорошим тоном использование partial в Unity?

    У меня класс Player стал слишком объемным

    Скорее всего, в такой ситуации partial только замаскирует проблему дизайна, но не решит её.

    partial лучше всего использовать в ситуациях, когда у тебя код генерируется автоматически.
    Ответ написан
    Комментировать
  • Почему не запускается exe?

    Чтобы можно было спокойно запускать экзешник - тебе нужно все зависимости положить рядом с ним.
    Делается это через "публикацию". Где это в студии накликать не подскажу, но в консоли это делается командой dotnet publish
    Ответ написан
    Комментировать
  • Генерация уникального рандомного значения?

    Вспомнил олимпиадное программирование.
    Посмотрел по коду:
    Для генерации случайной строки размером 10 используется словарь из 9 символов
    => информации в этой строке около 31.7 бит. Что даёт нам 3486784401 разных вариантов. Что спокойно умещается в UInt32
    => задачу можно упростить до генерации ОДНОГО числа в этом диапазоне с последующим форматированием в эту десятисимвольную строку.

    Дополнительно можно немного оптимизировать, если для гарантии уникальности использовать не список, а hashset.
    А скорость генерации строки и требуемую память - путём выделения буфера на 10 символов заранее.
    И ещё немного оптимизации, путём создания одного экземпляра Random
    Вот такая реализация получилась:
    public sealed class UniqueStringGenerator
    {
        private const long MAX = 3486784401;
    
        private readonly Random _random;
        private readonly HashSet<long> _history;
    
        public UniqueStringGenerator(int seed)
        {
            _random = new Random(seed);
            _history = new HashSet<long>();
        }
    
        public UniqueStringGenerator()
        {
            _random = new Random();
            _history = new HashSet<long>();
        }
    
        public string Next() => Format(NextNumber());
    
        public void Reset()
        {
            _history.TrimExcess();
            _history.Clear();
    
        }
    
        private long NextNumber()
        {
    
            if (_history.Count >= int.MaxValue)
            {
                throw new InvalidOperationException("Variants exceeded. Please reset");
            }
            var next = _random.NextInt64(0, MAX);
            while (_history.Contains(next))
            {
                next = _random.NextInt64(0, MAX);
            }
            _history.Add(next);
            return next;
        }
    
        private static string Format(long number) => string.Create<long>(10, number,
            static (span, number) =>
            {
                 // Алгоритм по-лучше придумать не смог.
                 // Проходимся по каждому биту числа, понемногу сужая выбор между числами в словаре.
                const string DICTIONARY = "123456789";
                for (var i = 0; i < span.Length; i++)
                {
                    var range = 0..DICTIONARY.Length;
                    while (!range.Start.Equals(range.End.Value))
                    {
                        var length = range.End.Value - range.Start.Value;
                        var step = length / 2;
                        if (step == 0)
                        {
                            break;
                        }
                        if ((number & 1) == 0)
                        {
                            range = range.Start..(range.End.Value - step);
                        }
                        else
                        {
                            range = (range.Start.Value + step)..range.End;
                        }
                        number >>= 1;
                    }
                    span[i] = DICTIONARY[range.Start];
                }
            });
    }

    100к строк генерирует менее чем за секунду на моём ноуте.
    Хотя есть два недостатка (достаточно серьёзных):
    1. "1" и "9" - две наиболее редкие цифры
    2. последние две цифры - всегда единицы.
    Ответ написан
    Комментировать
  • Почему не удаётся подключиться к PhpMyAdmin?

    phpmyadmin - это не база, а только панель управления базой.
    Тебе же нужно узнать адрес и порт mysql, и использовать их.

    PS:
    1. Лучше пересмотри свою идею использования DbUtils и посмотри, как в других проектах работают с базой. На том же metanit есть примеры работы с Dapper и EF Core. Иначе он у тебя превратится со временем в сотню утилит и твой код в лучшем случае будет выглядеть как какая-то процедурщина а-ля 1С, а в худшем случае - как спагетти. И это не говоря об эффективности.
    2. Вместо поделия Oracle под названием MySql.Data лучше использовать библиотеку MySqlConnector (причины тут: https://mysqlconnector.net/)
    Ответ написан
    1 комментарий
  • Как присвоить массиву int значение символа из строки в строковом массиве?

    Ошибка возникает из-за того что Convert.ToInt32(char) выдаёт код символа, а не число.
    В твоём случае нужно так:
    var text = "123 321";
    var statistics = new int[10];
    var arrStr = text.Split(' '); // И не надо ничего предполагать. Под индексом 0 лежит 123
    
    Console.WriteLine(arrStr[0][0]); // выдаст 1 
    // Ошибка из-за того что Convert.ToInt32(arrStr[0][0]) == 49 - это код символа '1'
    // statistics[Convert.ToInt32(arrStr[0][0])] = 1; // ошибка переполнение массива
    
    // Гарантируем, что arrStr[0][0] - цифра и парсим её.
    var digit = arrStr[0][0];
    var idx = digit is >= '0' and <= '9'
      ? digit - '0'
      : throw new InvalidOperationException("Not a digit");
    statistics[idx] = 1; // Нет ошибки
    Ответ написан
    Комментировать
  • Можно ли использовать .net пакеты в godot?

    Mono это тоже .net, так что не должно быть проблем.

    Но в случае с nlua проблемы будут, тк он нацелен на net6, а не netstandart
    Ответ написан
  • Ошибка CS0200 - Unity?

    Комментировать
  • Сколько максимум можно хранить данных в консольной программе на C#?

    У массивов и строк есть ограничение, что ты не можешь в них держать более чем int.MaxValue элементов (символов).

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

    В консоль ты можешь вывести сколько угодно - просто буфер консоли имеет ограниченные размеры и старые данные будут теряться.
    Ответ написан
    Комментировать
  • ASP.NET Core MVC это и есть ASP.NET MVC 5/6 или это разные?

    Это разное.
    Первый для net Core и NET 5+, а второй для net Framework.
    Второй уже легаси и даже МС не рекомендует делать новые проекты на нём
    Ответ написан
    Комментировать
  • Как лучше организовать многопоточное добавление данных в словарь (Dictionary)?


    многопоточное добавление данных в словарь

    Dictionary не потокобезопасен, по тому при обращении к нему из нескольких потоков нужно синхронизировать потоки (желательно при любых обращениях)

    Лучше использовать ConcurrentDictionary - в нём уже решены потенциальные проблемы при конкурентном доступе (например попытке изменить запись, которая уже удалена в другом потоке или удаление удалённой, или создании уже существующей, или чтении несуществующей/удалённой)

    Interlocked exchange лучше смотреть по месту, может подойдёт, а может нет.

    На счёт инмемори базы тоже следует посмотреть на конкретную задачу.

    UPD: ещё как хорошее решение звучит использование System.Threading.Channels, раз задача стоит накапливать записи и батчем их отправлять в СУБД.
    Так мы гарантированно решаем проблему гонок, так как фактически менять данные будет только один поток
    Ответ написан
    Комментировать
  • Как исправить ошибку, возникшую с фоновым потоком?

    Обращаться к элементам UI можно только из одного потока - того, в котором они созданы

    Починить можно так:
    https://docs.microsoft.com/en-us/dotnet/desktop/wi...
    Ответ написан
    Комментировать
  • Как можно проварьировать стандартные части программы Hello World на C#?

    хеллоуворд видится как какой-то буддистский коан.

    Минимальный современных хеллоу ворлд выглядит так:
    Console.WriteLine("Hello world!");

    Чтобы разобраться во всех следующих пунктах тебе следует продолжать изучать (хоть по курсу, хоть по книге), иначе всё расписывание само по себе потянет на небольшую книгу, или хотябы брошюру, и при этом врядли как-то тебе поможет:

    1. Можно просто убрать этот конкретный using, используя global usings или используя полные имена типов
    2. Можно не писать namespace или написать любой свой собственный. Или можно использовать file scoped namespace
    3. Можно придумать своё имя класса, можно сделать его статичным, можно сделать явно приватным или публичным.
    4, 5, 6. Main (точка входа) обязан быть статичным. Другие методы могут быть не статичными.
    Main можно сделать публичным или приватным, можно дать другое имя, но тогда придётся в опциях компилятора указать, какое имя.
    Main можно сделать асинхронным - тогда вместо void или int (Да, он может возвращать int) будет Task или Task<int>
    7,8,9. string[] args можно не указывать, или дать этому параметру другое имя (не args), но принимать что-то иное нельзя
    10,11. Это уже относится к телу метода и оно может быть любым. Но вместо Console.WriteLine можно написать полное имя - System.Console.WriteLine или сделать using static System.Console и тогда можно будет написать просто WriteLine
    Ответ написан
    5 комментариев
  • Как выполнить метод каждые 5 минут c#?

    Использовать System.Threading.Timer или System.Threading.PeriodicTimer или цикл с await Task.Delay
    Ответ написан
    Комментировать
  • Как запустить .cs файлы без компиляции в exe?

    Знаю, что .php файлы можно запустить без компиляции, закинув какую-то папку с файлами на диск с

    Потому что php - интерпретируемый язык.

    Каким образом я могу запускать .cs файлы без компиляции/ide?

    Никак, так как C# - компилируемый язык.
    Чисто теоретически ты можешь использовать C# Interactive, но там всё достаточно специфично и ограниченно.
    Ещё ты можешь компилировать C# из консоли через dotnet SDK
    Ответ написан
    Комментировать
  • Какие самые подходящие книги для изучения C#?

    Ведущий российский автор самоучителей

    Васильев выглядит как "на все руки умелец. Мастер ни в чём" (куча книг по совершенно разным языкам).
    Ну и автор просто профессор в универе (причём по физике, а не компьютерным наукам), а не практикующий разработчик.
    Ну и то что книга начинается с обзора net framework, а не net core как бы намекает.
    Судя по содержанию - книга покрывает прям очень базовые темы примерно до середины книги от Гриффитса.

    Так что лучше заплатить один раз чуть больше, ИМХО.

    PS: Ещё можно посмотреть на книгу Прайса (она уже даже для C# 10 есть)
    C# 10 and .NET 6 – Modern Cross-Platform Development: Build apps, websites, and services with ASP.NET Core 6, Blazor, and EF Core 6 using Visual Studio 2022 and Visual Studio Code, 6th Edition
    Ответ написан
  • Повлияет ли уход Microsoft на C#/.NET?

    Максимум - сложнее будет купить Pro/Enterprise студию и лицензию на Винду, если нужно деплоиться на неё (вот лишний повод скорее переходить на net 6)

    Ещё будет сложнее работать с Azure, тк сложнее оплата (лишний повод научиться самостоятельно админить сервера и строить свой private cloud)
    Ответ написан
    3 комментария
  • Странные вещи в моем C# коде... Что происходит?

    Вроде всё работает
    static string Greet(int hour)
    {
        int timeNow = hour;
        string hi = "";
        if ((timeNow >= 6) & (timeNow <= 12))
            hi = "Доброе утро, ";
        else if ((timeNow >= 12) & (timeNow <= 18))
            hi = "Добрый день, ";
        else hi = "Добрый вечер, ";
        return hi;
    }
    
    Console.WriteLine(Greet(5)); // Добрый вечер
    Console.WriteLine(Greet(6)); // Доброе утро
    Console.WriteLine(Greet(7)); // Доброе утро
    Console.WriteLine(Greet(11)); // Доброе утро
    Console.WriteLine(Greet(12)); // Доброе утро
    Console.WriteLine(Greet(13)); // Добрый день
    Console.WriteLine(Greet(17)); // Добрый день
    Console.WriteLine(Greet(18)); // Добрый день
    Console.WriteLine(Greet(19)); // Добрый вечер


    PS: в твоём случае вместо & лучше использовать &&, но в целом на работу это не влияет.
    Ответ написан
    Комментировать
  • Как Discord.NET обеспечивает связь между командами и атрибутами?

    При помощи System.Reflection ты можешь узнать, какие классы и методы сейчас загружены в память, и прочитать, какие у них стоят атрибуты, а также содержимое этих атрибутов, а потом динамически вызвать нужный метод с нужными параметрами.

    https://metanit.com/sharp/tutorial/14.1.php
    Ответ написан
    Комментировать
  • Актуальна ли книга Макдональда по WPF 4.5?

    Фундаментально WPF ничем не изменился. WPF в .NET 6 почти ничем не отличается от WPF в 4.8
    Какие-то проблемы от несовместимости могут быть, но их точечно можно порешать.
    Ну и ещё будут проблемы с тем, как идёт работа с проектом, тк проект в .NET Core отличается от проектов в .NET Framework, но это тоже легко можно загуглить.
    Ответ написан
    4 комментария
  • Как загрузить две сборки разных версий?

    На net framework ты можешь динамически загрузить разные версии сборок в один AppDomain, если они имеют строгое имя (с publicKey) и имеют разные номера версий.

    Если какая-то из сборок или обе не имеют publicKey, то тогда ты можешь динамически создать новый AppDomain и загрузить сборки в разные домены.
    Но тогда вместе их использовать не получится.
    https://stackoverflow.com/questions/20686362/c-sha...

    Ещё, если вдруг это какие-то зависимости у тебя требуют разные версии библиотек - ты можешь сделать так называемый binding redirect

    А на net (core) ты можешь использовать AssemblyLoadContext из ответа 0x25CBFC4F
    Ответ написан
    1 комментарий