Задать вопрос
Ответы пользователя по тегу C#
  • Достаточно ли изучить синтаксис C# для создания игры на Unity?

    Программировать бы по пути ещё научиться, а потом ещё нужно будет в самом юнити разбираться.
    Помни, что знать синтаксис языка и уметь программировать - это два практически независящих друг от друга навыка.
    Так что я бы ещё посоветовал кроме метанита ещё пройти курс по программированию на C# на ulearn.me - всегда его рекомендую.

    Разрешаю пропустить вообще весь учебник - судя по тому, какие тут вопросы задают, люди вполне делают игры на юнити вообще ничего не изучая и не читая.

    Если неиронично, то вполне можно пропустить 20 и 24 главу оттуда, и то и то даже в промышленной разработке сейчас практически не используется, а в юнити не используется вообще.

    Если у тебя цель в принципе делать игры и Unity это будет или какой-то другой движок тебе не принципиально, то я бы посоветовал тебе взять godot.
    Это попросили добавить в текст ответа

    ну как по мне если я смог написать бэк на Джанго, телеграм бота и еще пару скриптов для тренировки, то можно сказать "умею программировать на базовом уровне".


    Совсем не факт.
    То что ты описываешь, можешь сделать даже нейросеть, тк перечисленные задачи уже много раз обсасывались разными людьми и в интернете есть много примеров. Всегда можно сделать "по аналогии".

    Для меня "умею программировать" значит несколько иное:
    1. Нужно понимать, из каких составных частей строится любой алгоритм.
    2. Нужно понимать, как эти составные части выглядят в нужном языке и уметь из одного делать другое.
    3. Иметь хотя бы базовое понимание современного language design, понимать семантику языков, системы типов, понимать поток выполнения.
    Хотя бы поверхностно понимать, что делает компилятор.
    Понимать разницу между синхронным, асинхронным, и параллельным.
    4. И менее абстрактное - понимать, как происходит работа с памятью.

    Конкретно про юнити и c# точно нужно знать:
    1. Синтаксис, чтобы не пытаться объявить переменную в теле класса и не пытаться T запихнуть в переменную.

    2. Терминологию и ООП, чтобы не задавать вопросы вида "как прочитать переменную из другого файла" или "как вызвать метод из другого скрипта"

    3. Понимать фичи, которые используются в юнити: разницу между классами и структурами (чтобы понимать, почему DOTS и Burst именно такие, какие есть), понимать области видимости (и в рамках методов и в рамках классов), yield, sync/await, систему типов.

    В общем абсолютно точно нужно прочитать главы 1-13, 17, 18, 19, 21-24.

    Очень желательно 14-16 (так как всё
    ещё существует UniTask и какие-то вещи возможно ты захочешь вынести в отдельные потоки, которые не привязаны к физике или графике).
    Также они тебе понадобятся, если ты будешь делать свой сервер для чего-нибудь.

    Ради модов еще раз надо будет прочитать 19 и 25.

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

    В конце читай 26 главу, оно тебе пригодится, когда будешь делать что-то не на юнити.

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

    Повторюсь: единственное, что точно не стоит читать никому - это глава про Dynamic Language Runtime.

    Бтв метанит сам по себе очень ужатый. В нём всё ещё не рассматриваются вопросы:
    1. Тестирования
    2. Работы с dotnet CLI
    3. Опций компилятора
    4. Nuget
    5. Структуры проекта
    6. Best practice
    Ответ написан
  • Refit. System.Net.Http.HttpRequestException: 'Connection failure'. Почему вызывается исключение и как решить?

    Если у тебя клиент и сервер на разных хостах, то при отправке запроса с клиента на localhost - запрос до сервера не дойдёт по вполне логичным причинам)
    Ответ написан
    2 комментария
  • Возможно ли создать Telegram Web App C#?

    Возможно.
    Используй Blazor для этого.
    Ответ написан
    Комментировать
  • Можно ли в C# как-нибудь объединить оператор неявного преобразования и метод расширения в одной записи?

    Нельзя. И если у вас возникает такое желание - вероятно у вас где-то архитектура потекла.
    Ответ написан
    Комментировать
  • Есть ли способ преобразовать объект к типу?

    Во-первых, в C# нет такой операции, как "связывание переменной с указателем".
    object x = i; // Это называется "боксинг" или же "упаковка". _ЗНАЧЕНИЕ_ переменной i копируется в кучу и возвращается ссылка на это значение (object)

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

    Но! Можно приблизиться к этому через женерики и рефлексию. Дорого, неудобно, и не ясно, зачем нужно.
    Если ты подскажешь, что ты планируешь дальше делать с j - тогда будет более полезный код.

    using System;
    
    static class App {
        public static void Main() {
            var i = 999;
            var t = i.GetType();
            var x = (object) i;
    
            var doSomethingMethod = typeof(Helper).GetMethod(nameof(Helper.DoSomething));
            var doSomethingIntMethod = doSomethingMethod!.MakeGenericMethod(typeof(int));
    
            doSomethingIntMethod.Invoke(null, new[]{x});
        }
    }
    public static class Helper {
            public static void DoSomething<T>(object x) {
                var j = (T) x;
                // далее работаем
                Console.WriteLine($"{typeof(T)} {j}"); // System.Int32 999           
            }
    }

    Если это как-то связано с предыдущим вопросом, то советую остановиться и очень хорошо подумать.
    Ответ написан
  • Как использовать все потоки процессора при вычислении числа Фибоначчи в C#?

    Чтобы код можно было распараллелить - в нём должны быть шаги, которые можно распараллелить.

    По аналогии с примером из реальной жизни - ну никак ты не распараллелишь:
    1. Достать банку с огурчиками
    2. Открыть крышку
    3. Достать огурчик
    4. Нарезать огурчик на маленькие кругляши
    5. Положить кругляши на бутерброд

    У тебя каждый следующий шаг требует результат работы всех предыдущих шагов.

    В твоём варианте можно попробовать оптимизировать, добавив кэширование уже посчитанных значений (смотри OrderedDictionary). Чтобы какие-то можно было достать сразу из кэша или начать рассчитывать с 50%, а не с самого начала.
    Ответ написан
    1 комментарий
  • Как обработать данные(файл с данными на 14гб)?

    OutOfMemory возникает, когда у тебя не хватает оперативной памяти.
    Во-первых, Убедись, что у тебя приложение 64-битное.
    Во-вторых, большие объёмы данных все сразу в оперативку записывать не стоит. Тем более дважды, как у тебя происходит в LoadDataB.
    1. У тебя на Add каждый раз реаллокации данных происходят. Лучше 1 раз с запасом выделить место. Можно, например, сначала 1 раз прочитать файл, чтобы подсчитать количество строк, а потом уже заполнить.
    Или можно сделать связный список из чанков, тогда можно будет в 1 проход.
    2. ToArray копирует целиком List. Раз начал работать с листом - продолжай.

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

    UPD: видимо, это какая-то алгоритмическая задача, раз есть ограничение в 1мб.
    Тогда сразу иди думай над другим алгоритмом. Читай файл и одновременно делай все вычисления. Нивкакой массив промежуточные данные не сохраняй.
    Ответ написан
    2 комментария
  • C# Почему в ConsoleApp после await меняется поток, а в WinForms нет?

    Потому что в винформах свой synchronization context, а в консоли - стандартный.
    Почему в ConsoleApp после await меняется поток

    Вообще-то смена потока не гарантируется ;)

    Я знаю, что объекты интерфейса можно менять в единственном GUI-потоке.

    Вот ради этого контекст синхронизации и существует.

    CLR не нужно ничего понимать - ему заранее сообщается, что нужно использовать контекст синхронизации.
    Где именно это в недрах винформ происходит - не подскажу (надеюсь, меня дополнят)

    Если этого не сделать - используется стандартное поведение при котором разрешено менять потоки.
    Ответ написан
    Комментировать
  • Обьясните в чём суть инкапсуляции?

    Инкапсуляция защищает не от хакеров, а от неправильного использования объектов.
    Как пример - у тебя может быть класс "Заказ" и у него может быть какой-то статус (оплачен/ждёт оплаты/отменён итд).
    При этом у тебя могут быть правила типа: уже оплаченный заказ не может стать вдруг неоплаченным, а отменённый заказ нельзя взять обратно в работу.
    Тогда логично будет сделать поле статуса приватным (не доступным для изменения извне напрямую), а менять его только через методы, где будет происходить вся валидация.
    (В некоторых языках такие правила принято описывать на уровне типов, чтобы даже валидаций никаких было делать не нужно)

    Приватные поля объекта - это его состояние.
    Методы объекта - это способы его использования.

    Если у тебя в объекте появляется поле x и методы getX / setX (или авто геттеры/сеттеры в C#), то значит, что у тебя и нет явных причин делать это поле приватным, кроме соблюдения общепринятых соглашений.
    Ответ написан
    15 комментариев
  • Есть смылс использовать Getway в asp.net core?

    Для конечного клиента единая точка удобна.
    + инкапсуляция. Клиенту не нужно думать, что его запрос идёт в какой-то конкретный микросервис.
    + можно всякие ретраи и рейт лимиты реализовать один раз для всех мс.
    И много чего ещё

    В общем плюсы есть, минусы тоже, нужно думать головой и примерять на конкретный продукт.

    Если бы пользы и удобства в API gateway не было, то его бы никто не придумал
    Ответ написан
    Комментировать
  • Как писать приложения на WPF С# в Rider от JetBrains?


    так как в нём в отличии от Visual Studio нету графического конструктора и я не особо знаю как писать графику в нём.

    Или использовать всё-таки студию, или использовать xaml. Превьюшка в райдере есть, а конструктора действительно нет и не планируется.

    Ещё можно посмотреть в сторону авалонии (я хз зачем с нуля писать приложение на wpf, которое будет работать только не Винде), но у авалонии тоже только превьюшка.


    Так-же если вдруг знаете решение проблемы ниже буду очень благодарен


    Это лучше в отдельный вопрос вынести.
    Ответ написан
    7 комментариев
  • Возможно ли внести изменения на сервер игры?

    Это очень зависит от конкретной игры и в зависимости от кривости рук разработчика и протокола, по которому взаимодействует клиент с сервером - возможно разное.
    В этом плане молоизвестность и небольшой масштаб игры играет даже на пользу безопасности - скорее всего разработчик не станет изобретать какой-то сложный и гибкий протокол, а значит и уязвимостей в нём будет меньше.

    Например большой пример "фиаско" в плане безопасности - это Titanfall и Apex Legends - там ты отправив определённые данные на сервер можешь "попросить" его выполнить какой-то произвольный код у другого клиента с весьма высоким уровнем привелегий. (так, например, на одном из турниров хакер запустил читы у нескольких участников в прямом эфире).


    Если на этом ресурсе можно такое . Хотел бы спросить у людей, кто знает таких людей. Кто может реализовать подобную мысль.

    Это очень дорого будет стоить, тк такие люди реально штучные, тут должно сойтись два фактора:
    1. Очень глубокие и специфичные знания
    2. Готовность совершить уголовное преступление, за которое реально можно уехать в тюрьму на несколько лет.

    Вопрос буквально звучит как

    Если на этом ресурсе можно такое. Хотел бы спросить у людей, кто знает таких людей, которые могут за деньги убить моего обидчика.
    Ответ написан
    Комментировать
  • Как исправить ошибку error CS1001?

    https://learn.microsoft.com/ru-ru/dotnet/csharp/la...
    Предположу, что ругается на эти строчки, которые действительно не имеют смысла:
    public void InitializePlayer()
    {
    string = Player;
    }
    
    public void AddScore(int points)
    {
    int = 0;
    }

    Как исправить - знает только автор.
    Чтобы в будущем до такого не доводить - пиши в нормальном редакторе, который сразу подсвечивает проблемы, а не в блокноте.
    Ответ написан
    Комментировать
  • Что такое .Net и .Net framework?

    .NET Framework - это старая платформа, которая изначально в 2000х появилась.
    Потом в 2016 или типа того году появился .NET Core и .NET standart.

    .NET Core - новая, кроссплатформенная платформа, в которую изначально завозили всякие новые штуки типа нового JIT, вносили новые API, убирали старые, завозили новые фичи C#.

    .NET standart - спецификация, которая позволяет делать библиотеки, которые работают и на .net framework и на .net core с гарантией совместимости.

    Часть нововведений .NET Core вернулась в .NET Framework, а часть - нет.

    Потом произошёл ребрендинг и .NET Core переименовали в просто .NET, а .netstandard прекратили обновлять, тк все новые api теперь идут только в .NET, но не в .NET Framework.

    Как я понял .Net и .Net framework это программы, которые преобразуют папку с проектом в исполняемый файл, другими словами говоря - компиляторы.

    Не совсем. Есть две вещи:
    1. .NET runtime и .NET SDK
    2. .NET Framework и .NET Framework DevPack
    То что слева - это только рантайм, он отвечает за запуск уже собранных приложений.
    А вот в sdk уже входит компилятор и все необходимые для сборки приложений библиотеки.

    Сами по себе они отличаются тем, что .Net framework создаёт файл, запускающейся только на винде, а .Net - и на маке и на линуксе.


    Различие между .NET Framework и .NET я уже описал выше, но повторю:
    1. .NET Framework - старый/устаревший, менее производительный, и только windows (mono упоминать не будем)
    2. .NET с номером - новый/современный, более производительный, работает на разных платформах.

    Для нового проекта стоит выбирать только номерной .NET (сейчас вроде 9), если у тебя нет весомых доводов для выбора .NET Framework.
    Ответ написан
    4 комментария
  • Нормально ли использовать var вместо явной типизации в C#?

    1. Да, это нормально. Сильно легче код писать таким образом. (а иногда и читать, тк меньше слов дублируется. Например совершенно никакой ценности не несёт User user = userRepository.GetUserById(...) или многослойный женерик)

    2.

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

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

    Ты же не задаёшься вопросом, какой тип возвращает какой-нибудь GetUser, ToString, TryParse, FirstOrDefault?

    Если тебе сложно понять смысл кода без типов - значит кто-то плохие имена дал переменным.


    Данный код достаточно сложно разобрать человеку, который не писал это всё с нуля, а был присоединён через 4-5 лет ведения проекта.

    Очень смелое заявление, которое мало чем подкреплено.


    Как по мне, добавление возможности писать var вместо обычного типа было ужасной ошибкой Microsoft. Сам var был добавлен в язык вместе с анонимными типами и предназначался специально для них.

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

    2. Тренд говорит об обратном - автоматический вывод типов сейчас есть практически во всех статически-типизированных языках в том или ином виде.

    Ну и помни ещё, что ты же не в блокноте код пишешь - у тебя есть всякие inlay hints, которые могут рядом с именем переменной показать её тип, а наведя мышку на слово - ты узнаёшь о нём все (имя переменной, сигнатуру метода, документацию, итд)
    Ответ написан
    7 комментариев
  • Как преобразовать из char массива в string массив в си шарп?

    Вообще это очень похоже на https://ru.wikipedia.org/wiki/Проблема_XY

    Так что очень рекомендую посмотреть, из-за чего вообще возникает

    мне это надо так как в цикле, char переводится в цифры(кодировку)


    Впрочем вот решение

    Уверен, что не хочешь исправить первопричину?

    Точно уверен?

    Точно-точно уверен?

    Точно пре-точно?

    Может всё-таки прочитаешь про https://ru.wikipedia.org/wiki/Проблема_XY?
    Если точно прочитал

    Просто в цикле вызывай char.ToString()
    Полный код

    var stringsArray = Console.ReadLine().Select(x=>x.ToString()).ToArray();








    PS: увы, при открытии внешнего спойлера - открываются все вложенные
    Ответ написан
    Комментировать
  • Почему asp net потребляет много оперативной памяти на сервере?

    Пахнет утечкой памяти, даже очень-очень нагруженные приложения редко больше пары гигов потребляют.
    "простейший api-сервис" редко больше 1гб потребляет
    Я бы начал со снятия дампа памяти, чтобы понять, какие объекты столько занимают, а там уже можно будет и найти конкретное местно, где утечка произошла.

    https://learn.microsoft.com/en-us/dotnet/core/diag...
    https://learn.microsoft.com/en-us/dotnet/core/diag...
    Ответ написан
    Комментировать
  • Динамическая компиляция в net 8.0?

    Посмотри в сторону Microsoft.CodeAnalysis.CSharp.Scripting, но экзешник с помощью неё ты не сделаешь вроде бы

    https://weblog.west-wind.com/posts/2022/Jun/07/Run...
    Ответ написан
  • Как автоматически загрузить документы на сайт, используя selenium или что-то похожее?

    selenium везде кидает свои исключения и я не не знаю как их правильно обрабатывать, когда мне просто например нужно нажать на кнопку, если не получилось, то пробовать пока не получится.

    1. Я бы сейчас вместо селениума лучше бы взял playwright - у него API гораздо удобнее в плане всяких ожиданий
    2. thread.sleep использовать для этого - это неправильное решение. Нужно ожидать появления/исчезновения элементов по селектору
    3. Если хочешь, чтобы тебе помогли с исключениями - лучше бы их текст сюда скинуть тогда.
    Ответ написан
    3 комментария
  • Как переменную string преобразовать в List в C#?

    var str = "a b c";
    var list = str.Split(' ').ToList();

    А вот почему юнити зависает - надо смотреть на код целиком.
    То что написано в вопросе не является валидным C#-кодом в принципе.
    Ответ написан
    Комментировать