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

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

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

    Если у тебя в объекте появляется поле 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#-кодом в принципе.
    Ответ написан
    Комментировать
  • Что делать если Visual Studio не поддерживает виндовс 8.1?

    Раз для C#, то посмотри в сторону Rider или VS Code.
    Ну или подумай над вариантом перейти на win 10 / 11
    Ну или торренты
    Ответ написан
  • Почему тип не может преобразоваться в родительский?

    Покажи код, который вызывает ошибку.
    В ошибке написано, что кастануть можно, но только явно.
    Ответ написан
  • Почему рекомендуется использовать private а не просто ставить везде Public?

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

    Вот пример из комментариев о том, как делать не стоит:
    class Character {
      public double health;
      public void TakeDamage(double damage) {
        if(damage <= 0) return;
        this.health -= damage;
        if(this.health <= 0) {
           this.Die();
        }
        // ...
      }
      public void Die() {
        this.DoSomethingSpecial();
        // ...
      }
      
      // Этот метод в будущем будет удалён, оставлен пока как костыль
      public void DoSomethingSpecial() {/*...*/}
    }


    Потом спустя хз сколько времени ты вернулся к коду.
    Как ты будешь вспоминать, как правильно стоит наносить урон персонажам?
    Через TakeDamage или в каких-то случаях можно напрямую изменить поле health?
    Если в каких-то случаях нужно напрямую использовать поле health, то в каких?
    Если ошибёшься - возникнут закономерные баги.

    Про скрытие деталей реализации:
    Допустим, что ты решил добавить в игру поддержку модов.
    Как разработчик мода поймёт, какие методы на персонажах можно вызывать не беспокоясь о том, что мод сломается в следующей версии игры?
    Например без использования модификатора internal - разработчик мода может подумать, что этот метод можно вызывать, а по факту - в следующей версии ты, как разработчик игры, планируешь его удалить или изменить сигнатуру, что поломает мод.
    + если у тебя многие вещи сделаны через поля, то тогда ты не сможешь использовать интерфейсы (ну или их использование будет затруднено)
    Ответ написан
    Комментировать
  • Есть ли такая архитектура?

    то уже нет смысла ни в UnitOfWork, ни в Repository. То есть можно избавиться от Infrastructure слоя, чтобы схема была уже такая: UI, Application, Domain.

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

    Просто в случае с UnitOfWork и Repository накладывают только лишнюю нагрузку, потому что это и так реализовано в EntityFramework.

    Тогда будет усложнено тестирование, так как ты не сможешь замокать EF.
    Лучше всю работу по построению запроса тоже вынести куда-то в инфраструктурный слой - тогда и UoW и "Repository" не придётся тащить в домен.
    Ответ написан
    Комментировать
  • Насколько Kestrel актуален для self-hosted web-сервера?

    Кестрел то актуален. Не актуальны сейчас пакеты с 2.2 и ранее.
    Сейчас всё что связано с aspnetcore идёт сразу вместе с sdk, а не как раньше (всё ещё выглядит как очень странное решение со стороны мс)

    И он используется по-умолчанию и так.
    https://learn.microsoft.com/ru-ru/aspnet/core/fund...
    Ответ написан
    3 комментария
  • Как удалить сессию из БД после истечения срока?

    1. Можно сессии хранить в чём-то типа редиса - там можно задавать ttl
    2. При хранении в обычной реляционке - можно на всякие события аутентификации, когда ты читаешь таблицу сессий - смотреть на ttl и удалять просроченные.
    3. Сверху ещё добавляем какую-нибудь задачу в cron, которая будет раз в сутки чистить.

    Но не совсем понял механизм, как сделать sign-out при не активности или полном истечении времени сессии. Единственное что приходит в голову это background tasks, но думаю, что есть более нормальные решения этой проблемы.

    Не обязательно удалять сессию сразу после её истечения - всё равно же при запросах проверяешь время действия.
    Ответ написан
    Комментировать
  • Как обезопасить программу С# от взлома?

    Вообще раз уже допускается наличие сетевого соединения между клиентом и сервером, то напрашивается просто вынести все критические функции на сервер.

    Но я просто пытаюсь угадать что и от чего ты пытаешься защитить.
    Ответ написан
    Комментировать
  • Где принято хранить переменные окружения в ASP.NET Core?

    Переменные окружения всегда хранятся в переменных окружения.

    .env-файл - это не переменные окружения, а конфиг, который потом должна подхватить программа и добавить данные из него в свои переменные окружения.
    В .NET есть пакет, который делает ровно это: https://www.nuget.org/packages/dotenv.net

    В .net для конфигов принято использовать классы и интерфейсы из Microsoft.Extensions.Configuration.
    Самый распространённый вариант конфига - файл appsettings.json.

    Если мне память не изменяет, то m.e.c по-умолчанию в asp net core настроен так, чтобы тащить конфиги из appsettings, переменных окружения, и аргументов командной строки.

    Отдельно можно ещё сделать интеграцию и с другими вариантами конфигурации при помощи "Configuration providers".

    Подробнее можно почитать в документации: https://learn.microsoft.com/en-us/aspnet/core/fund...
    Ответ написан
    2 комментария