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

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Есть достаточно популярная библиотека библиотека Json.NET от Newtonsoft.
    Ответ написан
    5 комментариев
  • Стоит ли учить сегодня ASP.NET и можно ли на этом заработать?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Начнем с терминологии, а то хейтеры тут не особо разбираются =) Между ASP и ASP.NET MVC разница примерно такая же, как между Java и JavaScript.
    Java - это язык, как и C#. Под них есть свои веб-фреймворки, такие как JavaEE, Spring для Java или ASP.NET MVC, NancyFX для C#.


    Учить ASP (classic ASP) или ASP.NET (который Web Forms) с нуля уже не стоит. А вот ASP.NET MVC - отличный выбор. Это уже достаточно зрелый фреймворк, на котором работает много серьезных проектов (таких, как StackOverflow) и которая востребована на рынке как в России, так и в мире.

    Сам C# достаточно интересный, активно развивающийся язык. Платформа себя чувствует неплохо на любых популярных устройствах. Хорошо развивается .NET Core, являющийся переосмыслением монолитного .NET Framework, позволяющий разрабатывать компатные кросслатформенные приложения, в том числе и с использованием ASP.NET Core, которые можно развертывать самостоятельно, без огромного сервера за спиной, аналогично Node.js.

    Конечно, с ASP.NET MVC не пофрилансишь и сайты-визитки разрабатывать не так удобно =) Но поддерживать крупные приложения - одно удовольствие.

    А Java - это уже такой динозаврик, который стагнирует в роли вечного догоняющего, потихоньку будет сходить на нет в ближайшее десятилетие. Да, платформа обеспечила себя специалистами, тоннами легаси-проектов, которые необходимо поддерживать, поэтому с работой и под нее проблем не будет и менеджеры часто выбирают эту штуку, как проверенное десятилетиями средство. Но с точки зрения обычного программиста, я не вижу смысла выбирать Java.
    Ответ написан
    3 комментария
  • Можно ли получить имя переменной?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Начиная с C#6.0: nameof(val)
    Ответ написан
    2 комментария
  • Как изменить объект формы из другого класса?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Контролы нужно изменять только из того треда, в котором они создаются, то есть в основном потоке!
    Можно оборачивать изменяющий код в делегаты Action и передавать в Control.Invoke() формы. Пример
    Ответ написан
    3 комментария
  • Я не умею готовить репозиторий или он просто не очень?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Желательно почитать по поводу работы EF и IQuerable в частности. С помощью этого интерфейса и LINQ вы сможете формировать запросы (которые рендерятся в нативный SQL), а не просто фильтровать коллекции.
    private IQuerable<Student> GetLogs()
    {
        return context.Logs;
    }   
    public IEnumerable<Student> GetLogsForStudent(int id, DateTime from, DateTime to)
    {
        return GetLogs().Where(x => x.Id == id
                                    && x.Date >= from
                                    && x.Date <= to)
                        .ToList();
    }


    Все используют lazy loading?

    Зависит от количества данных и критичности по скорости.

    Если мне нужен в 1 контроллере/сервисе не 1 репозиторий? мне по 1 их подключать?

    Да, по одному. А можно в сервис или UnitOfWork объединять.

    Изачем он для юнит тестов если можно спокойно moqнуть весь dbcontext?

    dbcontext мокать нет смысла хотя бы потому, что он гвоздями к EF прибит. СУБД менять - это не такая распространенная практика, а вот от ORM (и от EF в частности) отказываться в пользу производительности - это реальный кейс с ростом нагрузки.
    Ответ написан
    Комментировать
  • Как из списка базового класса сделать список наследуемового класса?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    *Какая-то беда с дизайном.*

    Кастовать вниз по иерархии (downcast) напрямую объекты A в B нельзя, потому что A - это не B. Потому что B содержит какое-то дополнительное состояние (b), которого нет в A и компилятору неизвестно, каким оно должно быть в текущем виде (A конструировался иначе, чем B и как получить валидный B из A - известно лишь программисту).
    Об этом вам пытается рассказать рантайм (Invalid Cast).

    Что касается методов, которые не приводят к желаемому:
    Enumerable.OfType<T>() - фильтрует по типу и законно возвращает пустой список (у вас список A, там действительно нет B)
    Enumerable.Cast<T>() - последовательно делает каст, который невозможен.

    Можно попытаться скопировать объекты в новый список:
    listA.Select(x => new B{ a = x.a }).ToList();

    Но это прокатит лишь в том случае, если мы сможем достать из A необходимые данные для конструирования объекта B. Важно понимать, что это будут именно ДРУГИЕ объекты. Если A некопируем по своей природе, то этот фокус не пройдет.
    Ответ написан
    1 комментарий
  • Best Practices ASP.NET, в чём смысл многослойности?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Сервис - это бизнес-логика, которая позволяет абстрагироваться от DAL с его репозиториями.

    Слои:
    • абстрагированы друг от друга - заменяемы (допустим, заменяя презентационный слой можно из обычного сайта сделать SPA или бэкенд для мобильного приложения; мы не зависим от модели хранения (разные СУБД, файлы, глиняные таблички, голубиная почта), можем легко "вклинить" какой-нибудь прокси-слой между ними, который будет проводить какую-либо обработку или кэшировать, например)
    • абстрагированы друг от друга - их легко изучать, легко поддерживать (модифицировать, т.к. четко разграничена зона ответственности и меньше риск, что от взмаха крыла бабочки на другом конце света рухнет небоскреб)
    • легко поддаются независимому тестированию (взяв один тип можно легко воспроизвести вокруг него необходимое тестовое окружение)


    На проекты принято дробить, как правило, как для логического отделения, как и возможности безболезненно обернуть любой такой модуль в NuGet-пакет и подключать во многих местах. На волне этой идеи и появился .NET Core.
    Ответ написан
  • Какие API существуют в Visual Studio (C#) для работы с проектом?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Ответ написан
    Комментировать
  • Как реализовать динамическое изменение класса в C#?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Если я правильно понимаю, то вы про полиморфизм)
    Что-то вроде:

    // Каждая локаль должна иметь в себе словарь с переводами
    public interface class ILocale {
        Dictionary<string, string> Translation { get; }
    }
    
    // реализации разных локалей
    public class English : ILocale {
        public Dictionary<string, string> Translation {get; set;} = new Dictionary<string, string> {
            ["test"] = "Test"
        };
    }
    public class Russian : ILocale {
        public Dictionary<string, string> Translation {get; set;}  = new Dictionary<string, string> {
            ["test"] = "Тест"
        };
    }
    public class Ukrainian : ILocale {
        public Dictionary<string, string> Translation {get; set;}  = new Dictionary<string, string> {
            ["test"] = "Тест"
        };
    }
    public class Kazakh : ILocale{
        public Dictionary<string, string> Translation {get; set;} = new Dictionary<string, string> {
            ["test"] = "Сынақ"
        };
    }

    И, допустим, читаем из какого-то конфига:
    namespace TestLib{
        class Program {        
            static void Main(string[] args) {
                ILocale locale = GetLocale();
                WriteLine(locale.Translation["test"]);
                ReadKey();
            }
        }
    
        private static ILocale GetLocale() {
            // Мы можем получать ее динамически из конфига
            // но вызывающий код знает лишь, что это будет некая локаль, но какая
            // точно - неизвестно
            return Configuration.GetLocaleFromXml(); // псевдокод
        }
    }
    Ответ написан
    2 комментария
  • Скажите зачем использовать инверсию зависимостей?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    А если все-таки поменяется СУБД? А если EF под нагрузкой начнет тормозить? А если вы решите прикручивать какой-нибудь эластик?

    С помощью IoC вы сможете локализовать все изменения до отдельной точки реализации, в противном случае - придется перепиливать куда больше. И да, это вы еще и не протестируете.
    Ответ написан
  • Как тестировать DAL слой с помощью Unit тестов?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Нужно замокать DbContext. Чтобы отвязаться от EF и его DbContext, нужно построить архитектуру так, чтобы полностью скрыть DbContext от репозитория под своей абстракцией. Эту абстракцию и мочить. И тестировать репозитории на фейковом поставщике данных.
    Ответ написан
  • Как правильно хранить структуру c#?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Выглядит как сравнение "хардкод vs контейнер". Разница очевидна: Dictionary обеспечивает поиск со сложностью O(1) (против O(n) у свича) и способен динамически расширяться.
    В контексте задачи это похоже на DI для бедных. В этом случае Dictionary будет нагляднее.

    ИМХО по коду

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

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    ExecuteNonQuery() возвращает количество affected rows, но так как вы не изменяете таблицу (SELECT statement), то и ждать количество измененных строк нет смысла.

    For UPDATE, INSERT, and DELETE statements, the return value is the number of rows affected by the command.When a trigger exists on a table being inserted or updated, the return value includes the number of rows affected by both the insert or update operation and the number of rows affected by the trigger or triggers.For all other types of statements, the return value is -1.If a rollback occurs, the return value is also -1.

    В данном случае вас должен интересовать метод ExecuteScalar()
    Ответ написан
    1 комментарий
  • Какой компилятор и дебаггер C# на mac?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    7 комментариев
  • В чём разница: возвращение метода?

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

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    int result = new int[] { 5, -6, 2, 7, -5, 9, 1, -3 }.Where(i => i<0).Sum();
    Ответ написан
    Комментировать
  • Как в try catch вывести номер строки в которой ошибка?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Комментировать
  • Какие требования к С# джуниору?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Джун джуну рознь. Чем больше знаний - тем лучше.
    Троелсен и правда очень медленно и педантично повествует. Он удобен как настольная книга джуниора, как справочник - по конкретным задачам копать. Но, ИМХО, Шилдт будет приятнее.


    Основные контейнеры - преимущества и недостатки. Сложность алгоритмов поиска и вставки, сортировки. Хэш-таблицы, хэш-код объектов, equality и как это все устроено. Неплохо бы знать про многопоточность и примитивы синхронизации (в общих чертах).
    Хорошо бы знать кое-что про платформу .NET - типы-значения и ссылочные типы (про стек и кучу), про GC с поколениями, SOH/LOH, как можно устроить утечку памяти -> IDisposable.
    Уметь делать запросы к базе через голый ADO.NET.
    По базам данных: владеть основными запросами SQL, писать и вызывать хранимые процедуры. Знать что такое и зачем нужны индексы, нормализация, View, где смотреть query execution plan.
    Суметь рассказать о том, что такое MVC, ориентироваться в основных паттернах.

    Если курс на веб, то понимать работу HTTP, REST, знать основы фронта (приоритет селекторов в CSS, "всплывающие" объявления переменных в javascript, разницу "==" и "===", чем отличается асинхронность от параллельности и чем это грозит).

    Вызовет уважение в глазах интервьюера: понимать и применять IoC/DI, уметь писать тесты, работать с ORM (EntityFramework допустим), async/await и SynchronizationContext.
    Ответ написан
    11 комментариев
  • Как вернуть из функции ответ return разного типа?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Если генерируете некий List, то при не критической ошибке (файл пуст), стоит возвращать пустой List. Если ошибка критическая (файл не найден, невозможно открыть файл на чтение, невалидный аргумент, нулевой аргумент), то нужно бросать исключение.

    private static List<SomeType> ReadFromFile(string path) {
        if (path == null) {
            throw new ArgumentNullException("path");
        }
        if (File.Exists(path)) {
            string file = File.ReadAllText(path);
            ...
        } else {
            throw new FileNotFoundException(path);
        }
    }


    Тогда в вызывающем коде можно делать проверки:

    private void  doTheBestBtn_Click(object sender, EventArgs e)
    {
        try {
            var myList = ReadFromFile(txtInput.Text);
            ...
        }
        catch(ArgumentNullException ex) {
            MessageBox.Show("Необходимо указать путь к файлу!");
        }
        catch(FileNotFoundException ex) {
            MessageBox.Show("Указанный файл не найден!");
        }
    }


    PS File.ReadAllText сам бросает некоторые исключения, но допустим, что это самопальный тип.
    Ответ написан
    Комментировать
  • C# регулярка для ][?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы