Ответы пользователя по тегу C#
  • Почему данные на записываются в файл?

    Почитай справочник по C#
    metanit.com/sharp/tutorial
    Как int в string и т.д., что бы не возникало таких вопросов.
    Ответ написан
    4 комментария
  • [.NET] Является ли получение/запись элемента массива по индексу атомарной операцией?

    IL код, это только половина дела.
    Важна версия VM и битности сборки, debug/release режим.
    Используйте windbg, там можно посмотреть код метода который будет выполнен CPU.

    Я не отвечаю на вопрос, но даю информацию для размышления.
    Книга - "Голдштейн С. - Оптимизация приложений на платформе .NET - 2014".

    Выдержки из книги:
    "Запись 32-разрядного целого числа всегда выполняется атомарно. Это означает, что, если процессор записывает в ячейку памяти значение 0xdeadbeef, прежде инициализированную нулем, другой процессор никогда не получит частично измененное значение в этой ячейке."

    "К сожалению, то же самое нельзя сказать о более объемных данных; например, даже на 64-разрядном процессоре операция записи 20 байт не является атомарной и не может быть атомарной."

    "Всякий раз, когда для выполнения операции с областью памяти требуется выполнить несколько инструкций, немедленно возникает проблема синхронизации. Например, операция ++i (где i является переменной на стеке типа int) обычно транслируется в последовательность из трех машинных инструкций:

       
     mov еах, dword ptr [ebp-64] ; скопировать со стека в регистр
        inc еах ;                                        увеличить значение в регистре
        mov dword ptr [ebp-64], еах ; скопировать из регистра на стек


    Каждая из этих инструкций выполняется атомарно, но без дополнительной синхронизации есть вероятность, что два процессора вы­полнят части этой последовательности инструкций конкурентно. Это состояние гонки "race condition".

    Все семейства процессоров, на которых Windows может выполняться, поддерживают аппаратный примитив синхронизации с названием «Сравнить-и-Заменить» (Compare-And-Swap, CAS).

    В процессорах Intel х86 этот примитив реализован в виде инструкции LOCK cmpxchg. В .NET Framework примитив CAS реализован в виде множества перегруженных методов Interlocked.CompareExchange.

    // Код на С#:
        int n = . . .;
        if (Interlocked.CompareExchange(ref n, 1, 0) = 0) ( // заменить 0 на 1
          // ...выполнить некоторые операции
        }
        // инструкции на языке ассемблера х8б:
        mov еах, 0 ;
        mov edx, 1 ;
        lock cmpxchg dword ptr [ebp-64], edx ;
        test eax, eax ;
        i
        jnz not__taken
        // ... выполнить некоторые операции
        not_taken:

    "
    Ответ написан
    5 комментариев
  • Как сформировать список наиболее совпадающих по условию элементов?

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

    Напишите в гугл запрос
    site:habrahabr.ru mail поиск алгоритм
    Ответ написан
  • Объясните как правильно применять паттерн Repository с Entity Framework?

    Репозиторий - Это обертка над коллекцией элементов в памяти. Нужны методы Add, Remove, Get(id), GetAll, Find(predicate). Здесь не должно быть методов сохранить, редактировать т.к. для этого нам достаточно просто взять элемент из коллекции и изменить его. Репозиторий не должен знать о базе данных.

    Unit of work - Представляет список объектов изменных бизнес транзакциями, координирует запись этих изменений.

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

    https://www.youtube.com/watch?v=rtXpYpZdOzM
    https://www.youtube.com/watch?v=QwwfTWMrM9k

    Другой подход это DDD, в нем нет репозиториев и unitofwork. Но его сложнее делать и не сразу доходит.
    Ответ написан
  • Как разбить строку на элементы в C#?

    var a = "one, two, three, four, five".Split( new[] { ", " }, StringSplitOptions.None );
    foreach ( string b in a ) { Console.WriteLine( b ); };
    Ответ написан
    Комментировать
  • Как узнать получить данные наследованного класса в EF 6?

    Вы изучите для начала маппинг в БД 3 вида при наследовании.
    TPH, TPT, TPC
    https://msdn.microsoft.com/ru-ru/data/jj591617.aspx
    metanit.com/sharp/entityframework Глава 7. Наследование в Entity Framework
    Посмотрите как в БД сохраняется.
    Ответ написан
    1 комментарий
  • Как удобнее агрегировать события, оповещающие об изменении свойств?

    Корабль в каждый момент времени имеет определенное состояние.
    Что то может его изменять, и кто то должен быть подписан на эти изменения.
    Flux -> Redux, можно позаимствовать реализацию.
    Implementing Redux in C#

    Или стандартные Интерфейс INotifyPropertyChanged.
    Ответ написан
    Комментировать
  • Почему не принимает задачу на с#?

    Попробуйте убрать все using, и "BigInteger" заменить на "int".
    Ответ написан
  • Как заблокирвоать комбинацию ctrl+alt+del?

    Гуглите "C# KeyboardHook win api".
    Я делал пару лет назад, на виртуалке срабатывал как и ожидалось.
    Ответ написан
    Комментировать
  • Как написать сервер клиент на C#?

    1) WCF
    2) OWIN Self Host

    Все уже готово к использованию.
    Не надо работать с TCP напрямую, обертки вшиты в .NET.
    Ответ написан
    Комментировать
  • Возможно ли на C# создать HTTPS много-поточный сервер?

    Статья 2011 года.

    Используйте OWIN to Self-Host.
    https://www.asp.net/web-api/overview/hosting-aspne...
    odetocode.com/blogs/scott/archive/2014/02/10/build...

    Веб сервер в любом приложении просто и быстро, возвращать можете что угодно.
    Ответ написан
    Комментировать
  • Как вывести html-текст письма запретив js?

    Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment
    Ответ написан
    Комментировать
  • Как совместить гармонично совместить теорию и практику на C#?

    У меня наоборот было.
    Начитался про C#, а вот практики мало, и валился на простых вещах.
    Сейчас уже и эти пробелы закрыл.

    Раз книги читал, то сходи на ITVDN курс мидл и проф.
    Просто заучи, повторяй раз в неделю, месяц, полгода заметки из книг.
    Выписывай то что считаешь главным, своими словами.
    У меня набралось на 3-4 часа чтения.
    Но зато это покрывает ~5 книг сразу.

    Коллекция нужна только если используется Add, Remove. Книги то читали, вот например заметки из Jon Skeet C#:
    List - внутренне хранит массив и отслеживает логический размер списка и размер поддерживающего массива. Добавление элемента является либо простым случаем установки очередного значения в массиве, либо (если массив уже заполнен) копированием существующего содержимого в новый массив большего размера (обычно в два раза, т.е. происходит удвоение, но это недокументированно) и затем установки в нем значения. Сложность O(1) или O(n) в зависимости от того требуется ли копирование значений. Удаление элемента из List требует копирования расположенных за ним элементов на позицию назад, поэтому сложность составляет O(n-k), где k - индекс удаляемого элемента. По индексу RemoveAt() удалять значительно быстрее чем по значению Remove(), т.к. во втором случае происходит сравнение каждого элемента где бы он не находился сложность O(n).

    **Массивы** - самый низкий уровень коллекций в .Net. Унаследованы от System.Array, и они единственные имеют прямую поддержку в среде CLR. Массивы всегда изменяемы в терминах своих элементов, но всегда фиксированы в терминах своих размеров.
    Foreach для массива использует его свойство Length и индексатор массива, а не создает объект итератора.

    **LinkedList** - связанный список, каждый элемент которого имеет ссылку на предыдущий и следующий элемент. Быстро можно удалять, вставлять новые элементы, т.к. происходит только изменение ссылок на соседних узлах. Проход по коллекции тоже эффективен, но разумеется нет индекса.

    **Dictionary** - подобно List хранит свои элементы в массиве, со всеми вытекающими по вставке и увеличению размера последствиями. Для реализации эффективного поиска использует хештаблицу. Можно либо применять стандартные функции хеширования и эквивалентности внутри самих объектов ключей, либо передать реализацию IEqualityComparer в аргументе конструктора. Ключи должны быть уникальными, но хешкоды могут совпадать, что снижает эффективность поиска. Словарь даст отказ, если ключи являются изменяемыми и меняют свои хешкоды после того, как были вставлены в словарь. Внутри этого словаря нет гарантии порядка следования элементов, так что рассчитывать на него нельзя. Вставка происходит на основе ключа (что-то вроде индекса), а не последовательности заполнения словаря.

    **ReadOnlyDictionary<,>** - просто оболочка, которая скрывает все изменяемые операции за явной реализацией интерфейса, и генерирует исключение если они все же вызываются. Но если лежащая в основе коллекция (та что передается конструктору) модифицируется, то модификации будут видны через оболочку.


    APS.NET без рефлексии и доменов не работал бы.
    Ответ написан
    3 комментария
  • Написание диплома. C# + OpenCV + Angular 2 + ...?

    Возьми тут любой SPA (Web API, Core, MVC 5) + Ang + EF.
    Изучи как работает, переделай под себя.
    Ответ написан
    Комментировать
  • Каким образом можно отлавливать текст в консоли?

    Что то старое было:

    System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.FileName = "cmd.exe";
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.CreateNoWindow = true;
                //p.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8;
                int lcid = GetSystemDefaultLCID();
                var ci = System.Globalization.CultureInfo.GetCultureInfo(lcid);
                var page = ci.TextInfo.OEMCodePage;
                p.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(page);
                p.Start();
                try
                {
                    p.BeginOutputReadLine();
                    p.BeginErrorReadLine();
                    p.StandardInput.AutoFlush = true;
                    p.OutputDataReceived += (s, e) => { ... }
                    p.ErrorDataReceived += (s, er) =>  { ... }
                    while (true)
                    { // "\x3" - Ctrl+C
                        if (p.HasExited == true) { break; }
                        p.StandardInput.WriteLine( ... );
                    }
                }
                catch (Exception)
                {
                    ...
                }
    Ответ написан
    Комментировать
  • Как реализовать защиту приложения по его «железу» и дальнейшей авторизацией на сервере?

    Вы ведь новости читаете, крэк группы выкладывают свои труды регулярно для новинок ИГР, Софта.

    .net и c/c++/asm откроют за пару часов при желании.
    К железу привязываться - звонки с жалобами, HDD/CPU/Motherboard заменил и программа не запускается. Отломают быстрее чем напишите.

    Всю важную проверку на сервер, клиент при желании сломает все.
    Логин-пароль должно хватать, или думать что нить, но при росте популярности обойдут.

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

    Клиент не должен подключаться к партнеру на прямую, узнают через wireshark/netstat/... ip, и вас обойдут в этой цепи.
    Данные шифровать через https, проблем не будет, firewall пропустит.

    Флаги установки программы на ПК обходят быстро, снимают снимок состояния ПК, ставят ваше ПО, удаляют его, делают еще 1 снимок. Сравниваются 2 снимка, находят флаг присутствия установки программы. У MS такая утилита даже есть, название забыл.

    Хочется защиты - используйте виртуальные машины (~VMProtec), квалификация средняя и выше нужна для их взлома.
    Ответ написан
    3 комментария