Ответы пользователя по тегу C#
  • Что означает этот код?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Как уже сказали, ^ - это побитовый XOR (исключающее или)
    => тут return возвращает ровно одно значение - результат этого XOR-а.

    Сегодня так уже не следует писать, а лучше использовать HashCode.Combine (может не работать, если у тебя старый .NET Framework используется):
    public override int GetHashCode() => HashCode.Combine(Name, Address, Phone);
    Ответ написан
    2 комментария
  • Как работает Linq в данном примере и как научиться понимать комплексные записи Linq?

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

    Противоречит. Это действительно очень сложно читать.
    Но давай пошагово разберём:
    1. str2.All Все символы из str2 удовлетворяют условию str1.Count(y=>y==x)>=str2.Count(y=>y==x)
    2. str1.Count(y=>y==x) >= - в str1 количество искомых символов больше либо равно
    3. str2.Count(y=>y==x) - количеству искомых символов в str2

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

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

    Я бы этот код переписал так:
    // Эта функция считает, сколько раз каждый символ повторяется в строке
    static Dictionary<char, int> CountChars(IEnumerable<char> str) =>
      str
      .GroupBy(x => x)
      .ToDictionary(x => x.Key, x => x.Count());
    
    var str1CharCount = CountChars(str1);
    var str2CharCount = CountChars(str2);
    
    // Истинно, когда каждый символ из второй строки повторяется меньше или столько-же раз, как и в первой.
    return str2CharCount.All(x => x.Value <= str1CharCount[x.Key]);
    Ответ написан
    1 комментарий
  • Как умножать без периода в c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    По сути никак.
    У тебя в любом случае будет возникать период. Если не из-за двоичных чисел, то из-за десятичных. + всегда будет ограничение по точности для очень длинных чисел.

    Варианты, как преодолеть:
    1. Округлять до N значимых.
    2. Сравнивать на равенство через разность
    3. Использовать decimal (не панацея) или BigDecimal (нужно поискать библиотеку)
    4. Использовать библиотеки для символьной математики. (Гугли symbolic math)
    Ответ написан
    Комментировать
  • Почему работает статический экземпляр сериализованного класса?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист

    почему тогда нельзя сразу делать сериализованный класс статическим ?

    Потому что у тебя тогда не будет доступа к экземпляру класса
    Ответ написан
    Комментировать
  • Как копировать ReadOnlySpan со смещением?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Бери Span от массива, в который ты хочешь записать данные, и бери Slice от него.
    var array = new byte[10];
    var span = new ReadOnlySpan<byte>(new byte[5]{1,2,3,4,5});
    span.CopyTo(array.AsSpan<byte>().Slice(2,5));
    // array.Dump(); // 0 0 1 2 3 4 5 0 0 0

    Это работает благодаря тому что Span не копирует данные, а берёт указатель на область памяти.
    Ответ написан
    Комментировать
  • Как создать приложение в Windows Forms из имеющегося консольного?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Отвечая на поставленный в заголовке вопрос: да, возможно.
    Но придётся всё переписать.
    Ответ написан
    Комментировать
  • Можно ли реализовать MVC в WinForms и как в ней переносить данные с одной формы на другую?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    В Winforms чаще используют паттерн Model-View-Presenter.
    А передавать данные между формами можно хоть через прямые ссылки на формы в другой форме, а можно через System.Threading.Channels, а можно через модель - зависит от того, какое поведение конкретно ты хочешь получить
    Ответ написан
    Комментировать
  • Почему не получается преобразовать __int128 в BigInteger в своей функции?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. Ты берёшь указатель на переменную на стеке, которая после выхода из него уже не факт, что будет иметь то значение, которое тебе нужно.
    2. Тебе нужно выделить память заранее (или в куче) и в эту область памяти уже записывать результат.
    3. Лучше, чтобы память для результата выделялась на стороне C#, чтобы не было проблем с освобождением памяти.
    4. Сишный int не всегда равен шарповому int.
    5. В .NET уже есть структура для Int128, так что тебе не нужно байты перекладывать.

    6.
    public BigInteger (ReadOnlySpan<byte> value, bool isUnsigned = false, bool isBigEndian = false);
    принимает байты от длинного целого. Так что у тебя твой ToBigInteger работает неправильно, если ты в него подаёшь указатель, на __int128

    ptr_fact должно выглядеть как-то так:
    void ptr_fact(int32_t n, __int128* result)
    {
        *result = fact(n);
    }

    [DllImport("Test")] static extern void ptr_fact(int n, out Int128 result);


    Но смысла использовать ptr_fact я не вижу, тк обычный fact ты тоже легко можешь вызывать
    Ответ написан
    3 комментария
  • Как передавать информацию с ардуино/есп на компьютер?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Советую посмотреть в сторону MQTT:
    1. Он создан специально для IoT, в отличие от HTTP
    2. Это стандарт, в отличие от того что вы там можете навелосипедить с голым TCP
    3. Есть клиент для C#: Mqttnet вроде называется
    4. Для esp32 и esp8266 он точно реализован. Про 8битные ардуинки не знаю.

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

    На стороне сервера нужно будет установить брокер - их много и разных, и даже в облаках есть.

    https://mqtt.org/software/

    Брокер можно поставить отдельно, но можно поднять в рамках одного процесса с твоим приложением на C#, благо mqttnet такое позволяет
    Ответ написан
    Комментировать
  • Как создавать сущности во время выполнения программы?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Обычно для всяких дополнительных свойств в объекте заводят Dictionary - как раз тот самый "Ienumerable, в который можно будет добавлять свойства и обращаться по индексу"
    Ответ написан
    Комментировать
  • Почему при вводе программы, я могу вводить только единицы что бы выдало ответ?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Сыграю в угадайку, раз уж ты не сказал, что ты дал на вход, что ожидал, и что получил.

    1. Ты вводил числа с точкой в качестве разделителя дробной части, а запускаешь ты программу в системе с русским языком. И ты соответственно получил FormatException. (По правилам русского языка в качестве разделителя целой и дробной части числа используется запятая, в отличие от точки, которая используется в английском)

    2. При определённых значениях твоё выражение выдаёт NaN вместо определённого числа. Это значит, что у тебя произошло деление на 0, число ушло в бесконечность, или в мнимые числа. Если такого не должно происходить - значит ты неправильно перенёс формулу из твоего задания в код

    По качеству кода

    1. Не нужно заворачивать в объект чистые функции.
    2. Вместо транслита лучше бы в переводчик закинуть более осмысленное название
    3. Не нужно вставлять лишние скобки
    4. Для удобства чтения длинных математических выражений, можно его разбить на несколько строк и расставить отступы.
    Console.WriteLine("Введите x: ");
    var x = double.Parse(Console.ReadLine());
    Console.WriteLine("Введите a: ");
    var a = double.Parse(Console.ReadLine());
    Console.WriteLine("Введите n: ");
    var n = double.Parse(Console.ReadLine());
    
    var result = Solution.Calculate(x, a, n);
    Console.WriteLine($"Ответ: {result}");
    
    public static class Solution {
      public static double Calculate(double x, double a, double n) =>
        Math.Pow(Math.Tan(Math.Exp(a+2)), 1.0/3.0) * 
        Math.Pow(
          Math.Pow(a*x*n, 3) * 
          Math.Sqrt(1.0 / Math.Tan(Math.Pow(x, Math.Exp(a+2)))),
         3);
    }


    Вариант с исправленной формулой

    public static class Solution {
      public static double Calculate(double x, double a, double n) =>
        // По заданию мы тут берём корень 3-ей степени и сразу возводим в 3ю степень. Убираем их, тк эти две операции отменяют друг друга.
        Math.Tan(Math.Exp(a+2)) *
        Math.Pow(
          Math.Pow(a*x*n, 3) * 
          //котангенс(x) = 1/тангенс(x)
          Math.Sqrt(1.0 / Math.Tan(Math.Pow(x, Math.Exp(a+2)))),
         3);
    }

    Ответ написан
    8 комментариев
  • Возможно ли сделать wcf онлайн приложение при помощи IPv6?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Можно, если у тебя действительно есть ipv6. Даже пробрасывать порты не придётся.
    Но подключиться смогут только клиенты, у которых тоже есть ipv6

    PS: WCF сейчас не актуален, так что я бы не стал на него много времени тратить.
    Ответ написан
  • Не запускается проект .net. Что делать?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ты вызываешь dotnet run в папке с решением (solution. Файл с расширением sln).
    В ошибке явно сказано, что он ищет проект (project. Файл с расширением csproj).
    Варианта у тебя два:
    1. Вызывать в папке, где csproj всё-таки есть
    2. Добавить флаг --project и указать через него путь к проекту.

    Чтобы в будущем не путаться - давай проекту и решению разные имена.
    Ответ написан
  • В чем отличие .net и .net framework?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    .NET - это новая платформа. Развитие .NET Core
    .NET Framework - соответственно старая.
    Ответ написан
    9 комментариев
  • Как избежать постоянных проверок на null при вызове java класса?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Вариант 1:
    Сделать метод EnsureInitialized, в котором будет проверка на null и инициализация, если всё-таки null.

    Вариант 2:
    Оставить проверку на null, но упростить код:
    javaObject?.Call<bool>("IsBluetoothEnabled") ?? false


    Вариант 3:
    Убрать вообще нафиг этот static и сделать полноценную обёртку:
    public class JavaObjectWrapper {
      private readonly JavaObject _javaObject;
      public JavaObjectWrapper() {
        _javaObject = new JavaObject(); // тут какая-то инициализация этого объекта
      }
    
      // Дальше у нас по идее должна быть гарантия, что он всегда не null/
      public void CreateServer(string uuid) {
        _javaObject.Call("CreateServer", uuid);
      }
    }
    Ответ написан
    3 комментария
  • Не освобождается поток или другая причина недоступности файла?

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

    Но я не уверен, что проблема именно в этом.
    Ответ написан
    2 комментария
  • Почему после http запроса не работает программа?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Добавь GetAsync(...).ConfigureAwait(false), Видимо у тебя произошёл deadlock.
    Ответ написан
  • Как через рефлексию получить базовый метод, если сигнатура в переопределенном методе изменена?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Нюанс в том, что возможность сузить возвращаемый тип в наследниках - это синтаксический сахар.
    На самом деле в классе B объявлено два метода (грубо говоря):
    1. public virtual B Test() => new B(); DeclaringType = B
    2. public override A Test() => (A) this.Test(); DeclaringType = A

    Чтобы получить именно тот, который DeclaringType = A следует искать метод не только по имени, но и по возвращаемому типу. К сожалению, GetMethod так не умеет:
    Console.WriteLine(typeof(B).GetMethods().Where(x=>x.Name == nameof(B.Test)).Where(x=>x.ReturnType == typeof(A)).GetBaseDefinition().DeclaringType);//A
    Ответ написан
    Комментировать
  • Что и когда использовать: readonly-поле и get-свойство с методом по-умолчанию?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. Свойство вполне можно запихнуть в интерфейс, в отличие от поля.
    2. По всем гайдлайнам публичных полей быть не должно.
    В случае свойства это вызов метода, но возможно компилятор оптимизирует.

    Не возможно, а точно оптимизирует при компиляции в Release профиле. Эта оптимизация существует достаточно давно как раз из-за п2.
    Ответ написан