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

    Join блокирует вызывающий поток, пока не завершится тот, который джоинят.
    https://docs.microsoft.com/ru-ru/dotnet/api/system...
    Возможно, вам нужны не потоки, а таски и async/await.
    Ещё вы можете использовать коллбэки, чтобы запускать новый поток после завершения старого (но если честно, это какая-то синтетическая задача - в такой ситуации можно всё в одном потоке выполнить)
    Ответ написан
    Комментировать
  • Почему экземпляр производного класса приводят к базовому абстрактному типу?


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

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

    На C# очень многие используют стиль VIP (var if possible), в таком стиле ваш код будет выглядеть так:
    var instance = new  DerivedClass();
    instance.Method1(); // Красиво, компактно, никаких проблем.
    instance.Method2();


    В коде выше, из за приведения к базовому абстрактному типу, мы вынуждены создавать 2 экземпляра класса.

    Нет. Можно написать так:
    DerivedClass instance= new DerivedClass(); // только 1 экземпляр
    Interface1 instance1 = instance; // Но всё равно очень громоздко.
    Interface2 instance2 = instance;


    Не нужна "лишняя" операция приведения (апкаст).

    Апкаст - это бесплатная операция.

    Единтвенный лучай, когда нужно приводить класс к интерфейсу - это явная реализация интерфейса (без апкаста тупо не получится вызвать его методы)
    PS: простой код лучше сложного.
    Ответ написан
    5 комментариев
  • Как обновить значение переменной?

    Каждый тик таймера вы устанавливаете определённое значение переменной.
    В вашем случае нужно где-то сохранять данные об оставшемся количестве.
    Предлагаю вам завести класс, который хранит количество всего и поместить их в словарь.
    Будет что-то наподобие
    private Dictionary<string, Item> Inventory = new () {
        ["Дробовик"] = new () { Damage = 36, Clip = 30, Stock = 60 },
        ["Автомат"] = new () { Damage = 30, Clip = 30, Stock = 60 },
        ["Базука"] = new () { Damage = 51, Clip = 1, Stock = 2 }
    };
    public Item SelectedItem {get; set;}
    private void timer1_Tick(object sender, EventArgs e) {
      SelectedItem = Inventory[combobox.Text];
    }

    А потом там где вы выводите текст:
    label1.Text = SelectedItem?.Clip.ToString() ?? "";
    Ответ написан
    Комментировать
  • Как защититься от SQL инъекции в asp.net core? правильно ли я пишу?

    Сначала по пунктам, как ты делаешь:
    1. Кривое именование. Dapper позволяет маппить имена колонок к именам свойств.
    2. Похоже на ок, но стоит разбить интерфейс. Тк, скорее всего, не для всех сущностей будут нужны все эти методы.
    Именование не ок.
    dbConnection стоит переиспользовать.
    dbConnection.Dispose руками писать не нужно, тк dbConnection и так завёрнут в using
    SELECT * лучше не использовать
    Правильно ли я делаю?

    Не совсем

    Нет ли ошибок?

    Есть

    Как можно защититься от инъекции?

    Валидировать ввод.
    Не уверен, проверяет ли даппер сам параметры, но вы используете параметризованные запросы - так что должно быть ок.
    Если что - можете сами попытаться провести инъекцию (сами состаьте запрос или через burp suite)

    Например, в php экранировали вводимую пользователем форму например htmlspecialchars, надо ли на net core так же делать?

    Dapper сам должен это делать.
    Ответ написан
    Комментировать
  • Как сделать ссылку на проект?

    Ссылку на проект - это в csproj надо написать
    <ItemGroup>
      <ProjectReference Include="../OtherProject/OtherProject.csproj"/>
    </ItemGroup>

    А то что "Ссылки: 0" - это то, в каких местах идёт явное обращение к подсвеченному методу.
    Ответ написан
    Комментировать
  • Как подавить автогенерацию метода ToString у record в c#?

    В record'е можно реализовать ToString явно - тогда не сгенерируется его дефолтная версия.
    Или можно тупо не использовать рекорды

    UPD: Поэкспериментировал с рекордами и вот вывод:
    1.
    sealed override string ToString()
    Так можно делать только в sealed record
    2. Рекорд не наследует ToString от родителя - вместо этого он определяет свой собственный
    3. В рекоде можно спокойно переопределить ToString
    Если вы не хотите переопределять ToString во всех рекордах, то, возможно, вам нужны не рекорды, а обычные классы.
    Ответ написан
    2 комментария
  • Как из inputField получить int?

    InputField input = ...;
    int number = int.Parse(input.text); // если в input.text будет лежать не число, то будет FormatException

    либо

    InputField input = ...;
    if(int.TryParse(input.text, out var number) {
      // используем number. В этом случае FormatException не выпадет, но тогда будет возникать ощущение, будто ничего не работает.
    }
    Ответ написан
  • Как решить ошибку FormatException: Input string was not in a correct format. unity?

    str = int.Parse(inf_ot.text);
    str2= int.Parse(inf_do.text);

    У вас в inf_ot и ind_do не числа.
    Приведите пример текста, который хотите спарсить.

    PS: Но вообще код какой-то дикий. Я советую вам отложить юнити на потом и пока учить чистый C#.
    Замечания по коду

    public void Random()
    {
        str += str2 = otv; // Не будет работать, либо будет работать не так, как вам нужно.
    }

    R_Main - какое-то дикое сокращение, которое ничего не говорит о смысле скрипта. + В C# принято использовать PascalCase - никаких нижних чёрточек
    inf_ot, inf_do - То же самое, но ещё и транслит "от" "до"
    otvet - то же самое
    int str, str1 - лишнее сокращение + обман читателя. str большинство людей расшифровывают, как string, но тут числа
    otv - сокращение + транслит.
    Ну и парсинг чисел в апдейте - это жирноватая операция.

    PPS: вероятно, вам нужно это:

    Валидация - сюда можно ввести код, который не позволит пользователю вводит не-числа:
    https://docs.unity3d.com/ru/530/ScriptReference/UI...

    Событие ввода - чтобы не проверять текст каждый кадр:
    https://docs.unity3d.com/ru/530/ScriptReference/UI...

    Не забывайте про документацию - в ней хорошо описаны самые нужные моменты.
    Ответ написан
    Комментировать
  • Как вызвать метод на блейзор клиенте?

    Ошибка говорит, что HttpClient в блазоре не поддерживает Proxy
    А в коде вашей либы есть такой код
    public RestClient(Uri baseUrl, JsonSerializer serializer, IWebProxy proxy = null)
            {
                BaseUrl = baseUrl;
                Serializer = serializer;
                DefaultQueryString = new List<KeyValuePair<string, string>>();
    
                MaxRetryCount = 0;
                Proxy = proxy;
    
                HttpClient = new HttpClient(new HttpClientHandler
                {
                    Proxy = proxy // Вот из-за этой строчки происходит падение.
                });
            }


    Есть три варианта решения:
    1. Сделать форк либы и поправить эту строку.
    Но не факт, что это единственная строчка, которая вызывает несовместимые API
    2. Вызывать этот код на сервере, а клиенту передавать только данные.
    3. Написать собственный клиент для imdb
    Ответ написан
    Комментировать
  • Нужно ли вызывать Dispose у Bitmap?

    Dispose нужно вызывать всегда, когда вы прекращаете пользоваться ресурсом.
    В вашем случае битмапом владеет Holder, по тому Holder нужно сделать IDisposable и вызывать Dispose на нём при завершении работы программы.
    Если жизненным циклом битмапа управляет не Holder, то Holder не нужно делать IDisposable, но перед тем как избавиться от Bitmap - на нём надо вызвать Dispose, иначе произойдёт утечка памяти или ещё чего (не уверен, что там внутри битмапа хранится и какие там ограничения)
    Ответ написан
    3 комментария
  • Произошла проблема в Unity, поможете?

    У объекта класса RigidBody нет поля velosity - об этом тебе Unity говорит.
    Идём в документацию и видим, что есть поле velocity - ты опечатался.

    Раз у тебя возникают трудности в таких моментах, от забудь про существование юнити и займись просто C#-ом
    Ответ написан
    Комментировать
  • Как обновить данные в SQlite3 используя C#?

    UPDATE пишется по другому:
    UPDATE table_name
    SET column1 = value1, column2 = value2, ...
    WHERE condition;
    Ответ написан
    6 комментариев
  • Как правильно обработать исключение?

    Что-то заорал с этого кода:
    SQLiteCommand cmd = new SQLiteCommand($"SELECT Name FROM users WHERE Login = '{LoginField.Text}'", load);
                SQLiteCommand comand = new SQLiteCommand($"SELECT Surname FROM users WHERE Login = '{LoginField.Text}'", load);
                SQLiteCommand command = new SQLiteCommand($"SELECT Image FROM users WHERE Login = '{LoginField.Text}'", load);
                SQLiteDataReader Reader = cmd.ExecuteReader();
                SQLiteDataReader Readr = comand.ExecuteReader();
                SQLiteDataReader reader = command.ExecuteReader();

    И у вас не возникло ощущение, что вы что-то делаете не так и люди не пишет Reader,Readr, reader, cmd, command?
    В вашем случае нужно писать что-то типа этого:
    using System;
    using System.Data;
    using System.Data.SQLite;
    
    using var connection = new SQLiteConnection("Data source = accounts.db");
    connection.Open();
    using var cmd = new SQLiteCommand("SELECT Name, Surname, Image FROM users WHERE Login = @Login", connection)
    {
    	// Параметры используются, чтобы защититься от SQL-инъекций
    	Parameters =
    	{
    		new SQLiteParameter("@Login", "test") // то значение, которое должно быть подставлено вместо @Login
    	}
    };
    using var reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
    var name = reader.GetString("Name");
    var surname = reader.GetString("Surname");
    var image = reader.IsDBNull("Image")
    	? null
    	: Convert.FromBase64String(reader.GetString("Image"));
    connection.Close();
    // Делаем с name, surname и image что хотим

    Ещё я советую использовать async-await, чтобы интерфейс программы не зависал, пока запрос выполняется.
    Ответ написан
    Комментировать
  • Как с помощью программы на С# подписываться в тик токе?

    Берёте playwright/puppetter/selenium и автоматизируете с помощью него действия в браузере.
    В теории, можно посмотреть, какие запросы отправляет браузер при входе и подписке, и отправлять их вместо него
    Ответ написан
    Комментировать
  • Как сделать так чтобы можно было переключать языки с помощью кнопки?

    Можно сделать кнопку-ссылку, которая будет открывать нужную страницу.
    При этом все ссылки на сайте нужно генерировать динамически, чтобы везде стоял правильный язык.
    Вообще, культуру как-то можно указать через параметры пути, вместо query - такие ссылки чисто визуально выглядят лучше
    Ответ написан
    Комментировать
  • Как бы разложить по полочкам выражение с тернарными операторами(пример ниже)?

    Форматирование решает:
    int x, y;
    var quadrant = x > 0 
      ? y > 0
        ? "I"
        : "IV"
      : y > 0
        ? "II"
        : "III"

    Но вообще лучше использовать switch expression:
    int x, y;
    var quadrant = (x, y) switch {
      (>0, >0) => "I",
      (>0, <0) => "IV",
      (<0, >0) => "II",
      (<0, <0) => "III",
      _ => "Точка находится на одной из осей"
    }

    Чтобы использовать switch-expression, нужно обновиться до .NET 5 и C#, что я вам очень советую.
    А ещё стоит объединить X и Y в структуру Point - кажется в BCL уже есть такая
    Ответ написан
  • Error CS0201. Как решить проблему?

    https://docs.microsoft.com/ru-ru/dotnet/csharp/lan...
    Номер строки вам должен быть уже известен
    Ответ написан
    Комментировать
  • Как воспроизвести звук в Windows forms?

    https://docs.microsoft.com/ru-ru/dotnet/desktop/wi...
    А чтобы было циклично - ждёшь, когда закончится воспроизведение старого звука и сразу начинаешь его воспроизводить с начала.
    Ответ написан
    Комментировать
  • Что может C# для веб-приложения?

    Мне интересно в чем различие бэка на C# и Node js.

    1. C# строго типизированный и компилируемый - от этого он быстрее и лучше поддерживается средами разработки.
    2. В C# Много прикольных фич- например LINQ
    3. .NET многопоточный (при этом может работать и асинхронно), а nodejs работает в одном потоке только асинхронно (в основном)
    4. ASP NET Core быстрее, чем любой бэкенд фреймворк для nodejs
    5. На nodejs очень быстро можно написать прототип
    6. Nodejs может выполнять тот код, который выполняется на фронтенде - это свойство полезно для SEO-оптимизации.
    7. На C# обычно легче поддерживать, чем js

    И C# сейчас для Web'a уместен ли вообще?

    Вполне, но надо конкретные случаи рассматривать.
    Если нужно очень быстро написать несложный бэкенд - nodejs отлично решит эту задачу
    Ответ написан
    Комментировать