Ответы пользователя по тегу C#
  • Почему vs code не подчеркивает ошибки?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. У тебя должен стоять C# плагин
    2. У тебя должен стоять .net SDK на компе
    3. У тебя должен быть не голый файл, а проект (рядом должен быть csproj)
    Вот тут подробнее:
    https://qna.habr.com/q/947675#answer_1889815

    PS: Для голых файлов есть .csx
    Ответ написан
    2 комментария
  • Как с помощью return вернуть две переменные?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Есть несколько вариантов:
    1. Возвращать массив
    2. Объявить свою структуру или класс, в которой будет два нужных значения в виде полей или свойств
    3. Возвращать кортеж
    Ответ написан
    Комментировать
  • Как можно перенести данные из одного скрипта в другой?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Перенести саму переменную ты можешь только ctrl+X -> ctrl+V. А вот так можно передать данные, которые хранятся в ней:

    Вариант раз: обратиться напрямую к данным о монетах через поле/свойство экземпляра класса.
    Примерно так:
    public class Player {
      public Coins coins; // Как-то нужно присвоить ему значение, иначе будет NRE
      public void SomeMethod() {
        var total = coins.coinsAmount; // Вот мы и обратились
      }
    }

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

    И раз уж задаёшь в теге "C#" вопрос, то используй нормальную терминологию:
    Не скрипты, а классы.
    Не переменная, а поле.
    Ответ написан
    Комментировать
  • Как конвертировать object[] к Class[] где Class пользовательский класс?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Как решить такой трабл явно не приводя массив к нужному типу ?

    Эмм, а как должно это работать? У тебя массив обжектов, а ты ждёшь массив из Class-ов.
    Тебе нужна функция которая будет преобразовывать каждый элемент по отдельности, ибо в этом массиве не обязательно будет лежать Class.
    Может проще сразу массив нужного типа создать?

    Вообще вариантов несколько:
    1. Через Select и некую функцию, которая преобразует объект в твой тип.
    var classes = objects.Select(ConvertObjectToClass).ToArray();

    2. Через метод Cast - тогда просто произойдёт даункаст каждого элемента.
    var classes = objects.Cast<Class>().ToArray();
    3. Через Unsafe, но только если ты заранее знаешь, что внутри этого массива только Class-ы, а не какие-то другие типы, которые с ним не совместимы. Иначе получишь мусор вместо данных. Со структурами, конечно, работать не будет.
    var classes = System.Runtime.CompilerServices.Unsafe.As<Class[]>(objects);

    Вот что кстати будет

    using System.Runtime.CompilerServices;
    var objects = new object[] { new A { x = 1 }, new B { y = 2, z = 3 } };
    var something = Unsafe.As<A[]>(objects);
    Console.WriteLine(something[0].x); // 1
    Console.WriteLine(something[1].x); // 2
    var something2 = Unsafe.As<B[]>(objects);
    Console.WriteLine($"{something2[0].y} {something2[0].z}"); // 1 0
    Console.WriteLine($"{something2[1].y} {something2[1].z}"); // 2 3
    class A
    {
        public int x;
    }
    class B
    {
        public int y;
        public int z;
    }

    А вот если добавить ещё поле - всё совсем поломается.
    Ответ написан
    8 комментариев
  • Дорого ли обходиться использовавние lock, зачем делать Singleton with double check locking?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    зачем делать Singleton with double check locking

    Синглтон имеет смысл делать только тогда, когда (все три):
    1. Не факт, что за время работы приложения, понадобится экземпляр этого класса (иначе разруливаем через обычный static)
    2. Создавать его очень дорого, и его экземпляр требует много ресурсов (памяти, или может каких-то неуправляемых), по тому его нужно ещё и переиспользовать везде. (иначе зачем в принципе синглтон?)
    3. Нет возможности разрулить это на уровне Dependency Injection (иначе разруливаем через DI)

    Double check-lock необходим, чтобы гарантировать, что экземпляр синглтона будет создан только 1.
    Считается, что создавать экземпляр синглтона дороже, чем 1 лок.
    А проверка перед локом нужна затем, чтобы не блокировать лишний раз.
    сказали что lock это одна из самых дешевых оперций по синхронизации.

    Да, это так. Если гораздо более дорогие операции.

    get
                {
                      lock (Loker)
                      {
                            // only one check and everything is fine :)
                          if (_instance == null)
                          {
                              _instance = new Singleton1();
                          }
                    }
    
                    return _instance;
                }

    А зачем тебе Lock, если ты не собираешься изменять переменную?
    Сначала проверяешь на null, чтобы проверить, придётся ли тебе её менять.
    Потом поднимаешь lock и проверяешь снова, чтобы гарантировать, что ты один обращаешься.
    Для чтения lock не нужен.
    Проверка на null - гораздо дешевле, чем lock, по тому перед поднятием блокировки есть смысл проверить на null
    Ответ написан
  • Как рисовать график с временем в OxyPlot их базы данных?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    В нее попадают данные не по порядку например: 2022.02.10 20:00 , а потом 2022.02.10 10:00, и график рисуется криво:

    В SQL для решения такой проблемы есть волшебное слово ORDER BY
    Ответ написан
    Комментировать
  • Как сложить все числа в txt файле?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    А с чем именно у тебя возникла сложность?
    Прочитать файл - File.ReadAllLines
    Преобразовать строку в число, чтобы сложить - int.Parse или double.Parse, или любой другой Parse / TryParse. Ну Convert в конце концов
    Сложить циклом или через Linq, думаю, ты сам поймёшь как
    Как результат положить в переменную, наверное тоже и так понятно
    Ответ написан
    Комментировать
  • Как десериализовать массив именных объектов в именно объекте посредством Unity JsonUtility?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. У тебя json выглядит так:
    - cars
      - cars_bigs
        - force: 500
          weight: 1000
        - force: 1000
          weight: 4000
      - cars_smaller
        # и так далее

    Значит тебе объекты нужны такие:
    class CarsResult {
      public CarItem[] Cars { get; set; }
    }
    class CarItem {
      // К сожалению, нельзя на уровне системы типов выразить "Объект, у которого есть либо поле А либо поле Б"
      // Так что придётся указать оба поля
     // И нельзя это разрулить на уровне настроек сериализатора, если не придумывать кастомный сериализатор (не знаю, можно ли кастомизировать юнитивский)
      public Car[] BigCars { get; set; }
      public Car[] SmallCars { get; set; }
    }
    class Car {
      public int Force { get; set; }
      public int Weight { get; set; }
    }

    PS: В английском языке прилагательные ставятся перед существительными и не имеют числа. Так что "большие машины" - это "big cars", но никак не "Cars bigs". А "машины по меньше" - это "Smaller cars"
    PPS: Надеюсь, как указать нужные имена ты сам догадаешься, почитав документацию..
    Ответ написан
    2 комментария
  • Как сделать статический класс конфигурации в Asp.Net Core 6?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Делаешь нестатическую конфигурацию, а потом, во время инициализации кладёшь экземпляр конфига в public static cвойство.

    В .NET 6 это можно сделать примерно так:
    var builder = WebApplication.CreateBuilder(args);
    var app = builder.Build();
    GlobalConfig.Instance = app.Configuration;
    
    app.MapGet("/", () => $"I can use configuration w/o DI! AllowedHosts={GlobalConfig.Instance.GetValue<string>("AllowedHosts")}");
    
    app.Run();
    
    public static class GlobalConfig
    {
        public static IConfiguration Instance { get; set; }
    }

    Но лучше не надо)
    Ответ написан
  • Что такое this[...] в C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Это Индексатор
    https://docs.microsoft.com/en-us/dotnet/csharp/pro...

    По смыслу - функция, которая от key (который object) возвращает какой-то VkResponse.

    Синтаксически, вызов индексатора выглядит как обращение по индексу в массиве (с квадратными скобками)
    Ответ написан
    Комментировать
  • Как и что читать дальше по C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    msdn и метанит
    Ответ написан
    2 комментария
  • Почему массив работает как словарь?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Значит ArrayClassTest[0] и ArrayClassTest[1] - это один и тот же объект.
    Создавай два разных объекта через new и проблемы не будет.
    Ответ написан
    Комментировать
  • Как извлечь из байтов данные на C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Делаешь File.Open - ты получишь Stream, с помощью которого ты можешь считывать данные из файла.
    Там есть метод ReadAsync, в который можно передать некоторый буфер, чтобы заполнить его данными.
    Твоя задача - написать машину состояний (гугли) для каждого из твоих префиксов и побайтово читать файл.

    Для чуть большего удобства и эффективности можешь воспользоваться System.IO.Pipelines (гугли) и System.Threading.Channels

    Если очень интересно, могу скинуть ссылку на свой репозиторий, где с их помощью разбираются бинарные данные, которые передаются по сети
    Ответ написан
  • Как исправить ошибку "To run this application, you must install .NET Core"?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Есть несколько вариантов:
    1. Использовать .net 6 - он умеет тащить за собой не весь рантайм, а только то что нужно для работы.
    По крайней мере Hello World в 12мб получалось уместить (single file + self contained + assembly trimming)
    2. Поставлять программу вместе со скриптом, который проверит, установлен ли .net runtime и установит его сам, скачав из интернета
    3. Забить и оставить как есть (засунуть в архив)
    4. Использовать .NET Framework, который идёт на винде из коробки, но имхо - это шаг назад по всем параметрам, и так делать не стоит.

    UPD: Hello world таки весит 12 мегабайт
    Ответ написан
    6 комментариев
  • C# 10. Как отказаться от программы верхнего уровня?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Ну вообще это удобно. и я не вижу каких-то причин. чтобы писать по старому.
    Но если очень сильно хочется - ты можешь создать свой собственный шаблон, в котором будет создаваться старый public static void Main и без неявных юзингов.

    Вот так выключаются global usings:
    <Project Sdk="Microsoft.NET.Sdk">
        <PropertyGroup>
            <TargetFramework>net6.0</TargetFramework>
            <Nullable>enable</Nullable>
            <ImplicitUsings>disable</ImplicitUsings>
        </PropertyGroup>
    </Project>

    Вот так создавать свой шаблон:
    https://docs.microsoft.com/ru-ru/dotnet/core/tools...
    Ответ написан
    3 комментария
  • Какую книгу выбрать для ASP NET CORE 6?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    У aspnet core новая версия выходит каждый год, так что физически нереально выпустить хорошую книгу за это время.

    Из принципиально новых вещей, по сравнению с прошлыми версиями, у asp net core 6 - это Minimal API, описание которого умещается в одной статье в документации.
    В остальном, со времён net core 2.0 ничего сильно не изменилось (конечно, Startup менялся, но о том как корректно конфигурировать ты можешь прочесть в документации)

    Так что советую книгу "asp net core in action" и "asp net core 5 for beginners".
    Ну и метанит - вот на нём постоянно выходят обновления.
    Ответ написан
    1 комментарий
  • Для чего свойство класса создается в другом классе?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Почему экземпляр класса company создаётся в конструкторе класса Person - из-за того что писавшему пример лень было показать что-то более приближенное к реальности (в реальности так писать обычно не следует).

    Почему класс Person содержит поле типа Company - потому что автору так понадобилось.
    Почему нет?
    Ответ написан
    2 комментария
  • Как используется C# на КЕГЭ 2022?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Раз в спецификации сказано, что можно - значит можно.
    На всякий случай, лучше не используй слишком новых фич (Ориентируйся на C# 7, ибо почти наверняка они будут использовать mono), не используй сторонних библиотек (ибо интернета не будет), и не надейся на какие-то платформозависимые штуки (ибо не обязательно Windows будет стоять)

    Хотя на всякий случай лучше быть готовым к худшему - что на конкретном пункте сдачи будет установлен какой-нибудь Visual Studio 2008 Express

    UPD1: Написал в ФИПИ вопрос. Обновлю ответ когда ответят.
    UPD2: Ответ пришёл:
    Здравствуйте, Василий!



    1. Согласно спецификации ЕГЭ по информатике 2022 г. " В КИМ заданиями повышенного и высокого уровней сложности проверяется достижение следующих предметных результатов освоения основной образовательной программы на профильном уровне: …владение универсальным языком программирования высокого уровня (одним из нижеследующих: Школьный алгоритмический язык, С#, C++, Pascal, Java, Python), представлениями о базовых типах данных и структурах данных; умение использовать основные управляющие конструкции..."

    2. Примеров кода на C#, равно как и на языке Java, не будет. Как правило, программистам на языке C# однозначно понятен код с использованием основных управляющих конструкций, написанный на языке С++.

    3. Перечень стандартного ПО формируется органами исполнительной власти субъекта Российской Федерации с учетом информации, полученной от образовательных организаций, расположенных на территории субъекта Российской Федерации, об используемом в ходе образовательного процесса стандартном ПО, и информации, полученной от участников экзаменов.



    С уважением, специалисты ФГБНУ "ФИПИ"

    Мой вопрос


    Здравствуйте, увидел что в актуальной спецификации ЕГЭ по информатике указано, что при решении задач можно использовать язык C#.

    Однако в демонстрационном варианте примеры кода были даны только на C++, Python, АЯ, и Pascal (задание 6 и 22).


    И у меня возникли вопросы:

    1. На ЕГЭ 2022 действительно можно будет использовать C#?

    2. Если да, то будут ли в задании 6 и 22 примеры кода на C#, как это сделано с остальными языками?

    3. Какая версия языка и среды выполнения будут доступны на компьютерах? Есть ли какие-нибудь рекомендации по этому поводу?




    В общем на экзамене действительно можно будет использовать C#, но конкретные версии зависят исключительно от местного управления, а его решение зависит, видимо, от того что используют в местных школах.
    Так что вопрос надо задавать либо твоей школе, либо местному управлению образованием.
    Ну и ещё вроде как должны учитывать то, какое ПО хотят сами экзаменуемые использовать
    Ответ написан
  • Можно ли импортировать скрипты или компилировать их в процессе выполнения?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ответ Ukrainskiy Немного устаревший, и в новых версиях работать не будет.
    Сейчас следует использовать Microsoft.CodeAnalysis.CSharp.Scripting
    Примерно так:
    using Microsoft.CodeAnalysis.CSharp.Scripting;
    using Microsoft.CodeAnalysis.Scripting;
    
    var script = CSharpScript.Create("System.Console.WriteLine(\"Hello from script\")");
    script.Compile();
    await script.RunAsync();


    Также, если под "скриптами" имеются в виду классы для Unity, то можно их скомпилировать отдельно в Dll и импортировать через Assembly.Load, а потом вызывать через рефлексию.
    Ответ написан
  • Можно ли написать функцию, которая меняет значение таблицы автоматически в зависимости от времени?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Записывай время, когда номер был зарезервирован.
    Затем периодически (через cron, HostedService, Quartz, Hangfire, хранимые процедуры с триггерами, Task Scheduler или как-либо ещё) делай запрос наподобие
    UPDATE bookings WHERE status IS 'ACTIVE' AND add(reservation_date, '<тут твой срок>') > now() AND guest_visited IS FALSE SET status = 'INACTIVE';
    .
    Ответ написан
    Комментировать