Задать вопрос
Ответы пользователя по тегу C#
  • Какие есть нативные способы перемещения файла в Корзину на C# или .NET в Windows?

    Это и есть нативный способ.
    Microsoft.VisualBasic.FileIO - это не "прослойка visual basic", а вполне обычная библиотека. Она не более "не нативная" чем стандартная mscorlib или любая другая.

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

    Альтернативный вариант - использовать функцию из winapi SHFileOperationA
    Ответ написан
    Комментировать
  • Как называется паттерн, который добавляет объекту новый функционал?

    Далеко не у всего есть какое-то особое название (да и не должно быть).

    У всяких списков тоже есть методы для добавления чего-то, но нету Build.
    Ответ написан
    1 комментарий
  • Можно ли как-то скрыть пути API запросов, или это вообще не нужно?

    vabka
    @vabka Куратор тега Веб-разработка
    например для защиты от злоумышленников

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

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

    Иногда есть смысл сделать нечитаемое имя для роута, чтобы усложнить жизнь всяким системам для автоматического исследования API методами перебора, или чтобы сделать невозможным вызов какого-то метода клиентом, который не знает заранее какой-то секрет, но при этом нет возможности использовать Authorization заголовок или какой-то иной способ аутентификации.

    Но это очень специфичные сценарии, которые крайне редко актуальны, их не нужно применять по принципу "на всякий случай".
    Ответ написан
  • В чем смысл public _ {get;set} в c#?

    Потому что так исторически сложилось.
    1. Очень многие механизмы раньше (а какие-то и сейчас) работают только со свойствами, но не с полями.
    А если они и умеют работать с полями - часто по-умолчанию они с полями не работают.
    (Это относится ко всяким сериализаторам, ORM, и другим штукам, которые работают с объектами через рефлексию, создают прокси)

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

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

    По сути всё.
    Сказки про инкапсуляцию оставим для учебников, так как если мы делаем какую-то тупую DTO-шку, то никакой пользы от обращения через свойства мы не получим.

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

    Те же рекорды (record, record struct) вообще не позволяют тебе объявить поля и при этом скрывают многословность свойств.

    к примеру, не сделать этот int отрицательным

    На самом деле это очень редкий кейс.
    Зачем делать какую-то валидацию, если можно изначально использовать тип, который не допускает отрицательных значений?

    но вот смысл автоматических свойств я так и не могу осознать, хоть убейте

    Смысл автосвойств - чтобы не писать руками { get {return x;} set {x = value;}}.
    А смысл свойств вообще - чтобы можно было вынести в интерфейс, переопределить, итд.

    А ещё у свойства я могу не писать set или вместо set написать init и required, чего я не смогу сделать в классе с полями.
    Да, у поля можно написать readonly и получить по сути то же самое, но тогда его надо будет обязательно через конструктор инициализировать.
    Ответ написан
    3 комментария
  • Почему не определен символ в условной компиляции?

    Вот эти #if WINDOWS работают только во время компиляции + как вы сами убедились, дебажить их не очень удобно.
    Лучше вместо них использовать
    using System.Runtime.InteropServices;
    // ...
    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
      // ...
    }


    PS: вот эту галку с Windows ставить не обязательно. По идее оно автоматически должно выставиться, если ты компилируешь под windows.
    А серым может подсвечивать из-за того что VS использует какой-то другой таргет / другие флаги для анализа.
    Ответ написан
  • Какие ресурсы нужны для разработки AR приложения на Unity для "оживления" фото в школьном альбоме?

    1. Unity тут не нужно, и это даже будет избыточным.
    2. Берёшь Apple ARKit / Google ARCore, чтобы накладывать оживлённую картинку поверх обычной.
    3. Далее, чтобы как-то сопоставить картинку с "оживлённой" у тебя три варианта:
    а - добавлять какую-то рамку вокруг картинки и в неё кодировать какой-нибудь уникальный идентификатор, к которому привязывать "оживлённую"
    б - Добавлять какие-то скрытые маркеры в саму картинку
    в - Вычленять какие-то ключевые точки/паттерны из самой картинки и использовать их как идентификатор (например лица людей)

    Уже есть готовые решения для такого (гугли live photo ar)
    Ответ написан
    5 комментариев
  • Можно ли в C# заменить метод в интерфейсе методом с тем же названием, но другой сигнатурой в наследуемом интерфейсе?

    Нет, нельзя перекрыть и в твоём случае не очень очевидно, как оно должно работать.
    Твой первый интерфейс говорит, что метод Put должен принимать object - тоесть объект любого типа, а твой новый интерфейс почему-то сужает его до T, что делает его несовместимым.

    Наследники могут только расширять аргументы, но не сужать.

    Имею в виду, чтобы не нужно было оба метода реализовывать.

    Можно в крайнем случае использовать это:
    https://learn.microsoft.com/en-us/dotnet/csharp/la...
    Ответ написан
    Комментировать
  • Есть ли возможность для проекта .net core mvc при разработке в visual studio установить витруальное приложение для встроенного веб-сервера?

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

    Когда ты запускаешь приложение локально, у тебя нет никакого отдельного веб-сервера (ну вроде по умолчанию на Винде будет(по крайней мере раньше так было) iis express, но это не считается).

    Так что для добавления префиксов к маршруту тебе надо залезть в своё приложение.

    Чтобы не менять роутинг всех методов/контроллеров/ручек, ты можешь воспользоваться методом UsePathBase, который добавит к тебе в конвеер обработки запроса соответствующий middleware, который будет отрезать от запроса указанный префикс перед передачей запроса дальше (чтобы с точки зрения роутера запрос выглядел так, будто запрос пришёл на нормальный путь без префикса)

    Вот тут подробнее это объясняется и с примерами:
    https://andrewlock.net/understanding-pathbase-in-a...
    Ответ написан
    3 комментария
  • Можно ли хранить данные игрока Unity на Firebase?

    Можно, разрешаю
    Ответ написан
    Комментировать
  • ASP.Net Core: Почему SwaggerUI подставляет имя переменной в URL, а не значение?

    В случае с HttpGet виноват не swagger, а собственно ты.
    Читай, какой синтаксис у шаблонов:
    https://learn.microsoft.com/en-us/aspnet/core/mvc/...

    Вероятно, тебе нужно телефон не из маршрута получать, а из query.
    Знаки = в маршруте - это как-то очень странно, никто так не делает.
    [SwaggerResponse((int)HttpStatusCode.NoContent, "Клиент не найден")]

    Кажется, тебе тут нужен 404 not found, а не 204 no content.

    А в ответе тебе swagger показал собственно то, что вернул твой метод.
    Смотри снова в код, видимо ты где-то внутри $ забыл.
    Ответ написан
    Комментировать
  • Достаточно ли изучить синтаксис 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 не было, то его бы никто не придумал
    Ответ написан
    Комментировать