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

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    у вас ToString определен как
    return String.Format("{0}/{1}", this.numerator, this.denumerator);

    в нем используются поля класса
    но в конструкторе вы поля класса не заполняете

    сейчас
    if (numerator < 0 && denumerator < 0)
                {
                    numerator = Math.Abs(numerator);
                    denumerator = Math.Abs(denumerator);
                }
    
                if (denumerator < 0 && denumerator > 0 || denumerator > 0 && numerator < 0)
                {
                    numerator = -Math.Abs(numerator);
                    denumerator = Math.Abs(denumerator);
                }


    должно быть
    if (numerator < 0 && denumerator < 0)
                {
                    this.numerator = Math.Abs(numerator);
                    this.denumerator = Math.Abs(denumerator);
                }
    
                if (denumerator < 0 && denumerator > 0 || denumerator > 0 && numerator < 0)
                {
                    this.numerator = -Math.Abs(numerator);
                    this.denumerator = Math.Abs(denumerator);
                }


    Можете помечать приватные поля нижним подчеркиванием, тогда не будете путать их с локальными переменными, например _numerator, _denumerator
    Ответ написан
    3 комментария
  • Вопрос по оптимизации кода. Какой код будет более оптимальным для C#?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Нужно собрать релизную сборку и сравнить IL код. Вполне возможно что это одно и то же. А если различия и будут, то можно говорить только о конкретной версии dotnet framework. IL может изменяться в зависимости от конкретной CLR или конкретной версии framework. Но даже увидев инструкции я бы не стал предполагать, что из этого быстрее, а написал бенчмарк. Потому что все еще и зависит от железа на котором исполняется.
    https://github.com/dotnet/BenchmarkDotNet

    PS

    Прежде чем заниматься такими микрооптимизациями, нужно понимать, действительно ли это нужно. Если это ради обучения - ок, но если это реальная задача то в 99% случаев узким местом будет не тот код, который вы считаете узким местом. А реальность покажет профилировщик.
    Ответ написан
    3 комментария
  • Как отловить бесконечный повтор цикла?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Нажимайте на паузу в отладчике или (cntr+alt+break) - выполнение остановится и вы сможете смотреть текущую строку и локальные переменные.
    Ответ написан
    1 комментарий
  • Как регистрировать в контейнере IService в реализации которого конструктор требует другие сервисы?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Контейнер сам всё разрулит, он для этого сделан

    UPD:
    Проверочный код
    class Program
    {
        static void Main()
        {
            var container = new SimpleInjector.Container();
    
            container.Register<IDbService, DbService>();
            container.RegisterSingleton<IEntityCacheService, EntityCacheService>();
            container.Register<IAuthenticationImpl, AuthenticationImpl>();
    
            container.Verify();
    
            var instance = container.GetInstance<IAuthenticationImpl>();
            Console.WriteLine(instance.GetType());
        }
    }
    
    
    internal class AuthenticationImpl : IAuthenticationImpl
    {
        private IDbService dbService;
        private IEntityCacheService entityCache;
    
        public AuthenticationImpl(IDbService dbService, IEntityCacheService entityCache)
        {
            this.dbService = dbService;
            this.entityCache = entityCache;
        }
    }
    
    internal interface IAuthenticationImpl{}
    internal class EntityCacheService : IEntityCacheService{}
    internal interface IEntityCacheService{}
    internal class DbService : IDbService{}
    internal interface IDbService{}
    Ответ написан
    Комментировать
  • С# - что стоит изучать, чтобы попасть на первую работу?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Можно пойти на хэдхантер и посмотреть какие технологии просят рядом с c#. На мой взгляд самый большой спрос на фулстек разработчиков. Это значит c# + asp.net + EntityFramework + TSQL +js. За год можно «нахвататься» на джуна, если будете стараться, забудете про досуг и развлекухи. А потом после устройства на работу еще нужно будет по вечерам дотягивать пару лет точно.
    Ответ написан
    4 комментария
  • Зачем нужны делегаты?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Делегаты можно считать более безопасной версией указателя на функцию. С жестко заданной сигнатурой функции, а значит и с проверкой типов.
    Предвосхищая следующий вопрос, события в c# сделали для защиты делегатов от несанкционированного вызова (это как геттер/сеттер только для делегата)
    Ответ написан
    Комментировать
  • Как в ограничении where задать ограничение по struct или class одновременно?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    В данный момент нет возможности добавлять OR в ограничение where. Можете просто оставить public class Test<T>без ограничений.
    Ответ написан
    Комментировать
  • Где можно посмотреть решения задачи читатель-писатель различными методами синхронизации на C#?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Возьмите книгу Рихтера «CLR via C#». Там все это есть
    5deb6ddd534d9750389283.jpeg
    Ответ написан
    Комментировать
  • Актуальна ли книга Джеффри Рихтера: CLR via C# Программирование на платформе Microsoft NET Framework 4.5 на языке C#?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Книга Рихтера - хорошая база для понимания работы CLR. Большая часть будет релевантна и для CoreCLR в частности. А к тому времени как вы проработаете 4е издание, может Рихтер и про CoreCLR напишет.
    Ответ написан
    Комментировать
  • План изучения C# чтобы стать C# junior - как улучшить?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Могу дать список из личного опыта. Я менял профессию из эксплуатации телекоммуникационых систем перешел в программисты.
    К моменту получения 1й работы:
    - Я прошел 2 курса: Базовый по языку C# и базовый по TSQL (кстати тоже от ITVDN, лысый дядька норм объясняет).
    - Прочитал книгу Адама Фримена про asp.net.
    - Прочитал книгу Макконела "Совершенный код".
    - Научился в общих чертах пользоваться AspNet + EntityFramework + SqlServer

    Кстати, вот эта связка AspNet + EntityFramework + SqlServer очень часто мелькает в тестовых заданиях.
    Обычно хотят чтобы ты собрал простой сайтик-справочник, прикрутил к нему БД, прикрутил к нему авторизацию, и сделал пару форм и таблиц, чтобы продемонстрировать умение делать простой CRUD функционал.
    Надо сказать что книжка Адама Фримана примерно про это и рассказывает.

    На самом деле после трудоустройства и началось реальное обучение. Приходилось закрывать дыры в своих знаниях по вечерам и по выходным. Через год стало полегче. Наверное лучше найти какую-то стажировку еще на этапе обучения, чтобы пообщаться с реальными людьми и реальным кодом. Реальный мир лучше всего указывает недостатки и на то, что нужно изучать дальше.
    Ответ написан
    2 комментария
  • Как проверить вхождение диапазона в диапазон?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    class Program
        {
            private static readonly Range[] ExistedRanges = {
                new Range(0, 2),
                new Range(5.01f, 7),
                new Range(7.01f, 9)
            };
    
            public static bool IsValidRange(Range range)
            {
                return !ExistedRanges.Any(o => o.IsCross(range));
            }
    
            static void Main()
            {
                Console.WriteLine(IsValidRange(new Range(2.01f, 5)));
                Console.WriteLine(IsValidRange(new Range(11, 13)));
                Console.WriteLine(IsValidRange(new Range(1, 3)));
                Console.WriteLine(IsValidRange(new Range(3, 10)));
    
                Console.ReadKey();
            }
        }
    
        public struct Range
        {
            public readonly float Start;
            public readonly float End;
    
            public Range(float start, float end)
            {
                Start = start;
                End = end;
            }
    
            public bool IsCross(Range other)
            {
                return Math.Min(Math.Max(Start, End), Math.Max(other.Start, other.End)) >=
                       Math.Max(Math.Min(Start, End), Math.Min(other.Start, other.End));
            }
        }


    Алгоритм проверки пересечения не мой. Взял когда-то с просторов интернета. Но не помню где взял и как он называется. Если кто-то знает, напишите в комментах.
    Ответ написан
  • Как получить коллекцию студентов определенного грейда?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    То как вы написали модели означает для EntityFramework, что он должен использовать явную загрузку для коллекции Students. Вам нужно сделать что-то вроде:
    var gradesWithStudents = await _context.Grades.Include(o => o.Students).ToArrayAsync();
    Ответ написан
    Комментировать
  • Какой подход загрузки данных в Entity Framework 6 выбрать?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Это не взаимоисключающие вещи. Ленивая загрузка выполняется при обращении к свойству, если свойство еще не было загружено (она должна быть включена в настройках). Вы можете комбинировать эти подходы заранее загружая свойства с помощью жадной или явной загрузки для определенных запросов. Если свойство уже было загружено, то ленивой загрузке уже незачем работать. Главное понимать, как происходят запросы в БД при разных видах загрузки.
    Ответ написан
    Комментировать
  • Почему не применяются изменения модели в БД?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Скорее всего нужно указать целевой проект (куда будут писаться миграции) и стартовый проект (откуда будут браться настройки). Если у вас всё в одно проекте то пишите одинаковый:
    Add-Migration -Project MyAwesomeProject -StartupProject MyAwesomeProject -Name MyAwesomeMigration


    И еще если у вас postgresql, то нужно под него добавить пакет
    Ответ написан
    6 комментариев
  • Стоит ли читать Герберта Шилда C# 4.0 или как выбрать актуальную, фундаментальную, полезную литературу для новичков в программировании?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Уберите Шилда (устаревший взгляд на язык). Уберите Троелсена (много лишнего, зачем вам wcf и wpf, только голову забивать). Возьмите книгу Адама Фримана по asp.net. И начинайте что-то писать. Можете взять еще какой-то общий справочник по языку, типа Албахари. Рихтера пока отложите.
    В процессе используйте не только metanit, но и документацию к asp.net и что угодно что поможет решить задачу
    Ответ написан
  • Как сделать чтобы таймер мог выполнять долгую работу?

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

    public class TestWorker
    {
      private readonly Timer _timer;
      public TestWorker()   
      {
        _timer = new Timer(
          Callback, 
          null, 
          TimeSpan.FromSeconds(1),          
          TimeSpan.Zero);
      }
    
      private void Callback(object state)
      {
        try
        {
          //work imitation
          Thread.Sleep(5000);
        }
        finally
        {
          _timer.Change(
            TimeSpan.FromSeconds(1),    
            TimeSpan.Zero);
        }
      }
    }
    Ответ написан
    6 комментариев
  • Стоит ли читать эту книгу?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Если из этих книг выбирать, что читать 1м, то я бы сначала рекомендовал читать Албахари. Это более общая книга и она именно про язык C#, про синтаксис и ключевые концепции, как их использовать.
    CLR via C# Рихтера уже не совсем про C#, она рассказывает о CLR используя в качестве примера один из языков поддерживаемых CLR, т.е. C#. Эта книга больше про внутреннее устройство, она посложнее на мой взгляд. Там есть очень специфические разделы, которые вам могут не сразу (или никогда) не пригодится. Её стоит пробовать начинать читать, если не получается, то окладывать и пробовать позже. Она интересна с той стороны что Рихтер является консультантом Microsoft, некоторые из ключевых частей dotnet framework разрабатывал он. Интересно посмотреть внутреннее устройство, почему сделано так или иначе. Она становится интересной когда начинаешь задумываться о производительности, о блокировка, о многопоточности.

    Итого: читать обе, сначала Албахари, потом Рихтера. Отдельные темы Рихтера перечитывать по необходимости.
    И на этом не останавливаться, кстати. Дальше можно, например, взять книгу "Pro .NET Performance" если придется серьезно заниматься оптимизацией. Или еще какую. У меня например накопилось пара полок книг. И по C# и по смежным темам.

    PS
    А на работе у нас лежат: 3е издание CLR via C# и 4е издание CLR via C#, а также 3е издание C# in Depth и 2е издание C# in Depth. И если выйдут новые издания, мы их скорее всего купим тоже.
    Ответ написан
    2 комментария
  • ENTITY FRAMEWORK Fluent API как запретить создавать запись если она уже есть?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Это происходит потому что в трекере изменений EF нет информации о Country в момент сохранения.
    Вам нужно "присоединить" существующие страны к контексту перед сохранением. Вот пример в официальных доках
    Ответ написан
    Комментировать
  • Как упростить переменную в C#?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    class Program
        {
            static string DoSomeMagic(string localData, params string[] base64Strings)
            {
                var sb = new StringBuilder(localData);
                foreach (var base64String in base64Strings)
                {
                    sb.Append(Encoding.ASCII.GetString(Convert.FromBase64String(base64String)));
                }
    
                return sb.ToString();
            }
    
            static void Main(string[] args)
            {
                var localData = string.Empty;
                localData = DoSomeMagic(localData, "Тут", "все", "значения", "будут", "совершенно", "разные");
            }
        }
    Ответ написан
  • Как изучать библиотеки C sharp?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Вы можете использовать несколько вещей:
    1) можно перейти в Dependencies проекта, щелкнуть правой по сборке и выбрать "View in object browser" - появится окошко в котором можно поизучать сборку в целом, её типы и методы
    2) для типов .Net Framework, .Net Core и Xamarin можно воспользоваться официальной докой
    3) Если вы пользуетесь ReSharper, то у него есть возможность построить диаграмму типов для сборки в которой видно что от чего зависит.
    4) Попробуйте найти официальную доку для библиотеки. В описании nuget пакета обычно есть ссылка на страницу создателя.
    5) Как и указано выше просмотр исходного кода с помощью разного рода дизасемблеров. Тот же Resharper это умеет прямо из cтудии, или можно взять DotPeek
    Ответ написан
    Комментировать