Ответы пользователя по тегу C#
  • Хочу заняться мобильной разработкой, что правильней изучить в настоящее время - C# и Xamarin или Swift?

    impwx
    @impwx
    Разработчик
    У обоих вариантов есть свои плюсы и минусы.

    На Swift можно комфортно писать только под экосистему Apple. Xamarin же позволяет сделать кроссплатформенное приложение, но только с элементарным интерфейсом. Шаг в сторону от предложенных вариантов - и приложение начинает обрастать уродливыми проверками с платформозависимым кодом. Кроме того, бывают случаи, когда Apple выпускает обновление iOS, которое ломает совместимость с Xamarin и пока в Microsoft не выпустят патч, ваше приложение работать на новой операционке не будет.

    Так что всё зависит от ваших предпочтений. Если знаете C# - то порог вхождения в Xamarin однозначно ниже. Но более применимой на практике технологией мне все равно кажется Swift.

    Кроме того, для публикации приложений под iOS в обоих случаях потребуется физический Mac (или обходные пути для его получения) и платная лицензия разработчика.
    Ответ написан
    1 комментарий
  • Как лучше реализовать авторизацию в Web API?

    impwx
    @impwx
    Разработчик
    Да, это хорошая статья. Так оно обычно и делается - bearer token и атрибуты Authorize.

    Кроме обычных токенов есть еще дополнительный тип - refresh token. Они используются в том случае, если срок жизни первого токена истекает и нужно его обновить. Использовать их необязательно - зависит от кейса. Но на всякий почитайте:

    https://leastprivilege.com/2013/11/15/adding-refre...
    Ответ написан
    Комментировать
  • Почему GetUserManager() возвращает null?

    impwx
    @impwx
    Разработчик
    У человека была похожая проблема, и помогла вот эта строчка:

    app.UseCookieAuthentication(new CookieAuthenticationOptions());
    Ответ написан
  • Как в C# выполнить скрытый запуск консольного приложения?

    impwx
    @impwx
    Разработчик
    В свойствах проекта можно поменять тип сборки на Windows Application.
    Ответ написан
    4 комментария
  • Как исправить ошибку Ссылка на объект не указывает на экземпляр объекта?

    impwx
    @impwx
    Разработчик
    Можно подключиться к серверу удаленным отладчиком и поставить галочку "Break on exceptions". Для этого приложение должно быть собрано в конфигурации Debug, а у вас должны быть исходники.

    С веб-приложениями и сайтами внутри IIS делается очень просто, с классическим приложением будет посложнее, но тоже возможно.
    Ответ написан
    Комментировать
  • Как решить ошибку Cannot access child value on Newtonsoft.Json.Linq.JValue?

    impwx
    @impwx
    Разработчик
    Если покажете ваш JSON, будет понятнее.

    Судя по JValue, у вас в одном из случаев data становится не объектом со вложенными свойствами, а примитивным типом (например, числом или строкой).

    Возможно, это ошибка формирования данных, которые вы обрабатываете. Если же вы получаете данные извне и такая ситуация допустима, то вместо data["count"] != null поставьте проверку на data is JObject.
    Ответ написан
    Комментировать
  • Как отсортировать двухмерный массив по сумме элементов столбца?

    impwx
    @impwx
    Разработчик
    На помощь приходит LINQ:

    var random = new Random();
    
    // размеры массива, в качестве примера взяты константы
    var columns = 10;
    var rows = 5;
    
    // создаем данные
    var data = new int[rows][];
    for(var row = 0; row < rows; row++)
    {
        data[row] = new int[columns];
        for(var column = 0; column < columns; column++)
            data[row][column] = random.NextInt(-100, 100);   
    }
    
    // сортируем данные
    var sorted = data.OrderBy(x => x.Sum()).ToArray();
    Ответ написан
    Комментировать
  • Какие ответы лучше отдавать с сервера?

    impwx
    @impwx
    Разработчик
    Всё правильно. Если вдуматься в смысл метода, он должен получать id записи и возвращать либо ее содержимое, либо флаг ее отсутствия.

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

    Таким образом, нулевое значение id для логики не важно - это сделано, чтобы нагляднее показать, как можно обрабатывать ошибки вручную.
    Ответ написан
    Комментировать
  • Как нынче тестят Console?

    impwx
    @impwx
    Разработчик
    Это как раз та проблема, ради решения которой придумали Dependency Injection. Если вы жестко завязываетесь на статический класс Console, приходится мириться с его ограничениями, в частности - однопоточностью.

    Самое грамотное решение, за которое будет не стыдно - действительно, использовать DI и интерфейс. Придется реализовать два класса на его основе - "боевой" ConsoleWrapper и тестовый ConsoleWrapperMock.

    В качестве быстрого и грязного решения - если программа несложная и вы можете протестировать всё через входные параметры, можно в тесте запускать ее как внешний процесс (вызывать exe-шник) - тогда процессы будут независимы друг от друга и тесты можно будет гонять параллельно.
    Ответ написан
    2 комментария
  • Как получить список методов, свойств, полей, событий, классов, структур, интерфейсов в C#?

    impwx
    @impwx
    Разработчик
    Есть еще Mono.Cecil - альтернативная реализация рефлексии, позволяющая "расковырять" любую сборку, или создать свою. В том числе можно получить IL-код методов. Конечно, исходного кода на С# не получите, но проанализировать все равно можно. На основе Mono.Cecil сделан, например, декомпилятор IlSpy.
    Ответ написан
    Комментировать
  • Можно ли выполнять lock на list?

    impwx
    @impwx
    Разработчик
    Допустим, _inner используется у вас во многих местах, и есть некий публичный метод, который его возвращает. Тогда внешний код сможет вызвать этот метод, получить тот же экземпляр объекта _inner и поставить на него свой lock. Так можно случайно словить взаимоблокировку и повесить приложение.

    Подобные моменты бывает очень сложно отследить, потому объект может быть возвращен косвенно, по интерфейсу, или как-либо еще. Отдельное поле _lock - это просто правило хорошего тона, его создают для безопасности: очень маловероятно, что кому-то придет в голову использовать его за пределами инструкции lock и тем более вернуть из метода.

    Если у вас небольшой код и вы уверены, что знаете, что делаете - разницы нет.
    Ответ написан
    Комментировать
  • Порядок действий при переносе БД MS SQL при работе с Entity Framework?

    impwx
    @impwx
    Разработчик
    В EF существует встроенный механизм миграций. Судя по вашему описанию, он полностью подходит - в коде миграции можно описать любую трансформацию данных или схемы, которая осуществима средствами SQL.

    Но зачем каждый раз очищать все таблицы?
    Ответ написан
    Комментировать
  • Как точно записать float в бинарный файл?

    impwx
    @impwx
    Разработчик
    У BinaryWriter есть метод Write(float arg), и не нужно ничего конвертировать в строку.
    Ответ написан
  • Цикл foreach при работе с коллекциями и массивами?

    impwx
    @impwx
    Разработчик
    Вы перепутали понятия "коллекция" и "перечислитель".

    Обычно коллекция хранит элементы, а перечислитель - ссылку на перечисляемую коллекцию и текущее положение в ней. Каждый раз, когда вы используете стандартную коллекцию (массив, список и т.д.) в foreach, создается новый перечислитель. Поэтому сбрасывать состояние не надо. Вы же сделали химеру из коллекции и ее собственного перечислителя (return this as IEnumerator), поэтому вам приходится сбрасывать состояние руками.

    Это очень плохой код. Решение - не создавайте собственные коллекции вообще. Еще с C# 2.0 существуют универсальные обобщенные коллекции - List<T>, Dictionary<TKey, TValue> и множество других, которые следует использовать.
    Ответ написан
    Комментировать
  • Как сформулировать LINQ запрос для связи многие ко многим применительно к EF?

    impwx
    @impwx
    Разработчик
    Если вы говорите именно про EF, то у каждого User будет свойство Roles с коллекцией ролей, и наоборот, где автоматически сгруппированы нужные вам данные. Запрос можно написать так:

    var query = DbContext.Users.Include(x => x.Roles).ToList();
    Ответ написан
    Комментировать
  • Как правильно использовать input type="submit" в cshtml?

    impwx
    @impwx
    Разработчик
    Дело в том, что стандартные хелперы (Html.BeginForm и т.д.) по умолчанию не задают элементам классы, которые принято использовать в Bootstrap. Поэтому у каждого метода есть версия, которая принимает анонимный объект с атрибутами. Например, так:

    @Html.TextBoxFor(x => x.MyField, new { @class = "form-control" })
    Ответ написан
    5 комментариев
  • Как сравнить два csv файла?

    impwx
    @impwx
    Разработчик
    Читайте из файлов с помощью CsvHelper (устанавливается из NuGet), а дальше уже сравниваем два списка объектов любым привычным способом (хоть тем же Union).
    Ответ написан
    2 комментария
  • Как создать обобщение для списка лямда выражений?

    impwx
    @impwx
    Разработчик
    Во-первых, вы можете унаследоваться от Dictionary и не переизобретать методы:

    class AbstractExpressionList<T>: Dictionary<string, Func<T, T>> { }

    Во-вторых, ваш метод Execute уже написан авторами LINQ и называется Enumerable.Aggregate. Внутри он устроен примерно так:

    public T Aggregate(IEnumerable<T> values, T accumulator, Func<T, T> projection)
    {
        var current = accumulator;
        foreach(var value in values)
            current = projection(current, value);
        return current;
    }

    Вам понадобится начальное значение, от которого цикл будет двигаться. Можете использовать первый элемент в списке, или default(T), или передавать пользовательское значение.

    Поскольку ваш класс будет унаследован от Dictionary, который в свою очередь реализует IEnumerable, то вы можете использовать Aggregate напрямую, не реализовывая самостоятельно:

    var data = new AbstractExpressionList<T>
    {
        ["a"] = ...,
        ["b"] = ...
    };
    var result = data.Aggregate(...);
    Ответ написан
    1 комментарий
  • Допустимо ли возвращать порядковый номер объекта в GetHashCode()?

    impwx
    @impwx
    Разработчик
    Методы GetHashCode и Equals нужно переопределять, если вы хотите, чтобы два различных экземпляра одного класса могли считаться одинаковыми. В вашем же случае экземпляр будет равен только самому себе, потому что Id всегда будут уникальными. Получается, вы переизобрели семантику сравнения по ссылке, которая и так работает по умолчанию, если не переопределять GetHashCode и Equals вообще.

    Еще одна проблема возникнет, если вы будете использовать этот код в многопоточном окружении - без синхронизации доступа к LastLeasedID рано или поздно получите дубликаты.
    Ответ написан