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

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это значит на каком-то шаге (последнем) где-то получился double.NaN.
    Скорее всего это случилось здесь - Math.Pow(x, step * 2) / Fact((step * 2) + 1), т.к. факториал растет гораздо быстрее степенной функции и получилось так, что деление вернуло 0

    Попробуй использовать decimal вместо double, но тогда придется писать свою функцию возведения в степень (Math.Pow только с double работает)
    Ответ написан
    Комментировать
  • Как сделать шаблонный метод для мат операций с числами и Типом Vector2?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Интерфейсов чисел он не реализует. Есть 2 костыля:
    1. Вести словарь функций сложения
    var typeToFunc = new Dictionary<Type, AddFunc>() {{typeof(int), IntAdd}, {typeof(Vector2), Vector2Add}};
    
    var left = 123;
    var right = 14455;
    var result = Add(left, right);
    Console.WriteLine($"Результат сложения {left} и {right} = {result}");
    
    var leftVector = new Vector2(123, 55);
    var rightVector = new Vector2(55, 111);
    var resultVector = Add(leftVector, rightVector);
    Console.WriteLine($"Результат сложения {leftVector} и {rightVector} = {resultVector}");
    
    T Add<T>(T left, T right)
    {
        return ( T ) typeToFunc[typeof(T)](left, right);
    }
    
    object Vector2Add(object left, object right)
    {
        return ( Vector2 ) left + ( Vector2 ) right;
    }
    
    object IntAdd(object left, object right)
    {
        return (int) left + (int) right;
    }
    
    delegate object AddFunc(object left, object right);

    2. Создай монаду с int и Vector2
    var number = NumberOrVector2<int>.FromNumber(123);
    var newNumber = number.Add(() => 23, () => throw new InvalidOperationException("хранится число"));
    if (newNumber.TryGetNumber(out var result))
    {
        Console.WriteLine($"Получился результат: {result}");
    }
    else
    {
        Console.WriteLine($"Ошибка - хранился вектор");
    }
    
    public readonly struct NumberOrVector2<TNumber> where TNumber: unmanaged, INumber<TNumber>
    {
        private readonly TNumber _number;
        private readonly Vector2? _vector;
    
        private NumberOrVector2(TNumber number, Vector2? vector)
        {
            _number = number;
            _vector = vector;
        }
    
        public bool TryGetNumber(out TNumber number)
        {
            number = _number;
            return !_vector.HasValue;
        }
    
        public bool TryGetVector(out Vector2 vector)
        {
            vector = _vector.GetValueOrDefault();
            return _vector.HasValue;
        }
    
        public NumberOrVector2<TNumber> Add(Func<TNumber> numberAdd, Func<Vector2> vectorAdd)
        {
            if (_vector is {} vector)
            {
                return new NumberOrVector2<TNumber>(_number, vector + vectorAdd());
            }
    
            return new NumberOrVector2<TNumber>(_number + numberAdd(), null);
        }
        
        public static NumberOrVector2<TNumber> FromNumber(TNumber number)
        {
            return new NumberOrVector2<TNumber>(number, null);
        }
        
        public static NumberOrVector2<TNumber> FromVector(Vector2 vector)
        {
            return new NumberOrVector2<TNumber>(default, vector);
        }
    }
    Ответ написан
    Комментировать
  • Почему VSCode не создаёт блок Main при создании нового консольного приложения на C#?

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

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. Здесь, скорее всего нужны триггеры. На SO есть похожий вопрос - https://stackoverflow.com/questions/26418412/how-t...
    2. В данном случае, тебе нужно использовать больше чем 1 СУБД. Предлагаю такой вариант:
    - MySQL - для хранения всех сообщений
    - Redis - для очереди событий

    Алгоритм такой:
    1. Кто-то отправляет сообщение
    2. Сохраняешь сообщение в БД
    3. Публикуешь событие "сообщение добавлено"
    4. Все подписавшиеся отправляют это сообщение своим клиентам

    Получение истории - при первом подключении (это уже SELECT)

    Т.е. тут без активного опроса.
    P.S. если сервер только 1, то и какая-нибудь inmemory очередь сообщений сойдет.

    3. SignalR твою проблему не решит - это просто фреймворк поверх вебсокета (рекомендую использовать его, т.к. облегчает многие задачи). Твоя проблема кроется скорее в слое хранения, т.к. mysql (как и любая другая реляционная СУБД) плохо заточена под event-driven архитектуру, скорее запрос-ответ.
    Ответ написан
    1 комментарий
  • Как исправить ошибку ложного подключения на стороне TcpClient?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для взаимодействия ты используешь TCP.
    Connect() возвращается, когда установлено соединение, но само соединение все еще может находиться в очереди - то, что здесь и происходит.
    Поэтому, лучше такое решение:

    const int maxPartySize = 2;
    var party = new List<TcpClient>();
    var locker = new object();
    
    var ip = IPAddress.Loopback;
    var port = 50000;
    var server = new TcpListener(ip, port);
    
    server.Start(128);
    Console.WriteLine("Сервер запущен..");
    
    while (true)
    {
        var client = await server.AcceptTcpClientAsync();
        _ = ProcessClientAsync(client);
        Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} подключен. Текущий размер группы: {party.Count}");
    }
    
    async Task ProcessClientAsync(TcpClient client)
    {
        await Task.Yield();
        bool added;
        lock (locker)
        {
            if (added = party.Count < maxPartySize)
            {
                party.Add(client);
            }
        }
    
        if (added)
        {
            Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} добавлен в группу");
        }
        else
        {
            Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} НЕ добавлен в группу");
        }
        
        client.Close();
    }


    P.S. когда принимаешь клиента не нужно писать using TcpClient client = ... иначе клиент закроется до начала его обработки
    Ответ написан
    Комментировать
  • Юнити выдаёт ошибку cs0103, что делать?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    CS0103
    Предпринята попытка использовать имя, которое не существует в классе, пространстве имен или области. Проверьте правильность написания имени и директивы using и ссылки на сборки, чтобы убедиться, что это имя доступно.


    GameObject drinksSp = instantiate(drinks[drinkInt]);


    Что за instantiate?
    Ответ написан
  • Что стоит учить с или c++ или c#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это 3 совершенно различных, с точки зрения целей, языка. Лучше пойми что ТЫ хочешь, а потом выбери
    Ответ написан
    Комментировать
  • Как вывести double число c определенным числом знаков ДО ЗАПЯТОЙ и После в сумме?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Тут нужен Math.Round, но зависит от того какое округление нужно
    var value1 = 13.444;
    var value2 = 13.446;
    // С параметром MidpointRounding.ToNegativeInfinity - без мат. округления, просто отбрасываются
    Console.WriteLine(Math.Round(value1, 2, MidpointRounding.ToNegativeInfinity));   // 13.44
    Console.WriteLine(Math.Round(value2, 2, MidpointRounding.ToNegativeInfinity));   // 13.44
    // Если нужно мат. округление
    Console.WriteLine(Math.Round(value1, 2));  // 13.44
    Console.WriteLine(Math.Round(value2, 2));  // 13.45

    Поиграйся с MidpointRounding параметром
    Ответ написан
    Комментировать
  • Какие бывают режимы работы сборщика мусора в .Net?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    как их можно и нужно применить на практике?

    Применять их никак не нужно. Платформа сама решит в каком режиме ей нужно работать.
    Такая сейчас идет политика разработки: "просто пиши код, а остальное на нас"
    Ответ написан
    3 комментария
  • Unity: ошибка "NullReferenceException" при взаимодействии с объектом. В чём может быть причина?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Не вижу инициализации _arm
    Ответ написан
    9 комментариев
  • Как исправить ошибку подключения к sql в visial studio?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    На сколько я понял, используется авторизация Windows (3 пункт).
    SO в таком случае говорит, что нужно заменить User Id и Password на Integrated Security=SSPI;

    Думаю, лучше настроить обычную авторизацию, а не через Windows - https://www.guru99.com/sql-server-create-user.html
    Ответ написан
    3 комментария
  • Как получить полный nameof к статическому методу?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Посмотри на свойство DeclaringType у Member.
    Там можно получить название класса.

    Console.WriteLine(NameOf(( ) => SomeStatic.Value ));
    
    static string NameOf<T>(Expression<Func<T>> path)
    {
        var members = new Queue<string>();
    
        Expression? exp = path.Body;
        while (exp is not null)
        {
            if (exp is MemberExpression memberExpression)
            {
                var prevName = memberExpression.Member.DeclaringType?.Name;
                if (prevName is not null)
                {
                    if (members.TryPeek(out var last) || last != prevName)
                    {
                        members.Enqueue(prevName);   
                    }
                }
                members.Enqueue(memberExpression.Member.Name);
                exp = memberExpression.Expression;
            }
            else
            {
                break;
            }
        }
        
        return string.Join('.', members);
    }
    
    class SomeStatic
    {
        public static int Value { get; set; }
    }
    Ответ написан
    2 комментария
  • HttpListener разбить URL запроса?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. Жесткие пути с файлами (favicon.ico в примере) - отдаешь нужный файл
    2. Префикс для путей файлов (/static/... например) - проверяешь файл и отдаешь ответ
    Ответ написан
    2 комментария
  • Картинки и файлы для проекта?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    В настройках проекта есть возможность указать файл как ресурс. Он будет копировать в выходную папку.

    В райдере это в свойствах файла задается: 657fe6fb3033c854326217.png

    P.S. параметр Copy to output directory
    Ответ написан
    5 комментариев
  • Как повернуть объект в сторону его движения?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. Получаешь вектор движения игрока
    2. Получаешь вектор направления взгляда персонажа
    3. Рассчитываешь косинус между ними
    4. Находишь по нему угол
    5. Медленно поворачиваешь (угол / скорость) - иначе мгновенно повернется
    Ответ написан
    Комментировать
  • Как добавить несколько имен и сделать рандомный выбор?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    var names = new[] {"Ivan", "Alexey", ... };
    var random = new Random();
    var index = random.Next(0, names.Length);
    var randomName = names[index];
    Ответ написан
    Комментировать
  • Какой должна быть архитектура веб-сервиса работающего одновременно с мобильным приложением и с браузером?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Ответ написан
    Комментировать
  • Есть ли смысл завершать задачи генерируя ошибку(token.ThrowIfCancellationRequested()) если есть спобос получше?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Зачем завершать процесс генерируя ошибку(token.ThrowIfCancellationRequested())?

    1. Чтобы не плодить постоянно Result классы с шаблонными Cancelled.
    2. Как иначе определить успешно завершилась задача или токен был отменен?

    Вот есть способ завершать задачу return-ном в методе задачи.

    У тебя void, а если должен вернуть что-то? См. п. 2

    try-catch ресурса затратная конструкция

    Если это код который запускается 10000000... раз в мс, то да - затратная. А если это бизнес-логика, которая часто меняется, то нет - так быстрее вносить изменения - просто добавь еще один обработчик (не надо вносить кучу флагов)
    Ответ написан
    Комментировать
  • Как читать данные из файла?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    var file = File.OpenRead("path/to/file");
    var reader = new StreamReader(file);
    // спарсить данные
    file.Close();
    var fileToWrite = File.Open("path/to/file");
    var writer = new StreamWriter(fileToWrite);
    // записываешь данные
    fileToWrite.Close();
    Ответ написан
  • ReaderWriterLock VS await using?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это LOCK!!!!
    Никогда не используй асинхронный код внутри критической секции. Че случилось:
    1. Поток 1 взял лок
    2. Зашел в крит. секцию
    3. await перенес тебя в другой поток (например, 2)
    4. Поток 2 (новый) возвращает блокировку - НО ОН ЕЕ НЕ ДЕРЖИТ

    Если не веришь - попробуй то же самое, но с помощью обычного lock { } сделать. Тебя компилятор поругает
    Ответ написан
    1 комментарий