• [.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 комментариев
  • Почему после переноса шаблона на asp.net mvc шрифты и иконки уменьшились?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Проверяйте подключенные стили, особенно, если вставляли верстку в непустой шаблон проекта. Всякие умолчательные Site.css, бутстрапы (если не используются) нужно выпилить.
    Ответ написан
    2 комментария
  • Windows 10 - недостаточно памяти. Как исправить?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    Включите файл подкачки.
    Ответ написан
    Комментировать
  • Ajax кнопка Добавить в корзину не работает?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    У вас там аякс-запрос возвращает 503ю ошибку. Это серверная ошибка, которая говорит о том, что он не может обслужить ваш запрос в данный момент. Смотрите логи сервера / пишите в техподдержку.
    Ответ написан
    5 комментариев
  • Как осуществить переход на другую сцену при нажатии на кнопку в unity?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    SceneManager.LoadScene

    В следующий раз сначала в гугл с такими вопросами.
    Ответ написан
    1 комментарий
  • Почему нет доступа к форме при использовании потока?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Как изменить textbox формы из другого класса?

    bw.DoWork += (o, eo) =>
    {
      for (;;)
      {
        i = time.Time(i);
        Thread.Sleep(1000);
        // https://msdn.microsoft.com/ru-ru/library/zyzhdc6b.aspx
        Invoke(new Action(() => {
          Text = "Таймер. Время: " + i;
        }));
      }
    };
    Ответ написан
    3 комментария
  • Хранение данных в C#, как лучше?

    Rou1997
    @Rou1997
    Словари и списки для хранения в оперативной памяти, а на диск все равно нужно как-то их записывать, если БД не подходит то сериализация в JSON или XML.

    Как искать в словарях и под одним ключом хранить несколько значений?

    Под ключом храните массив или список, а в нем уже значения, к слову форматы JSON и XML все это поддерживают.
    Ответ написан
    Комментировать
  • Возможно ли автоматическое приведение типов в c#?

    Rou1997
    @Rou1997
    поэтому FieldPair.Name имеет тип Object

    Не Name, а Value хотели сказать.

    возможно ли как-то использовать переменную Name сразу как string или допустим int без постоянного приведения типов

    Нельзя, приведение так или иначе где-то будет, либо в самом FieldPair, либо вне его. Да и зачем это?
    Ответ написан
  • Asp.net MVC сайт развернутый в облаке Microsoft Azure Web Sites выдает ошибку. Как исправить?

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

    Вообще файловые базы считаю оправданными только в случае с sqlite, а все остальные лучше пусть сервер обслуживает.
    Ответ написан
    Комментировать
  • Как в WebClient на C# прочитать куку?

    Rou1997
    @Rou1997
    Никак, потому что вы не работаете с ответом сервера, метод DownloadFileAsync скрывает его от вас, для полноценной поддержки HTTP переходите на HttpWebRequest или RestSharp, между прочим WebClient внутри тоже не идеален, вроде бы файлы недокачивал, а переписал на HttpWebRequest, и все пошло.
    Ответ написан
    Комментировать
  • Весь код программы на c# пишется в одном файле Program.cs?

    @AxenovSergey
    Так делают только во время обучения или для очень простых программ.
    Ответ написан
    Комментировать
  • Как перевести string[] в List?

    yamaoto
    @yamaoto
    la programmeur
    using System.Linq;
    ...
    var list = myArray.ToList();
    Ответ написан
    Комментировать
  • Стоит ли начать учить c# с этого ресурса?

    @GoldGoblin
    я иногда почитываю metanit.com
    Ответ написан
    Комментировать
  • Несоответствие валидации на сервере и клиенте. ASP.NET MVC?

    andrewpianykh
    @andrewpianykh
    Задайте русскую культуру на сервере в файле web.config в system.web
    <globalization culture="ru-Ru" uiCulture="ru" />

    Также для даты можно попробовать добавить в модель аттрибут
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}"]

    stackoverflow.com/questions/18548816/mvc-4-date-cu...
    Ответ написан
    Комментировать
  • Как совместить гармонично совместить теорию и практику на 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 комментария
  • Для чего нужно virtual/override?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ахтунг, товарищ. Перед тем как сомневаться в профессионализме своих коллег очень советую хотя бы немного сомневаться в собственном. Это как минимум изредка полезно. А теперь ноги в руки и вперёд читать про таблицы, виртуальность и методы. Это не просто полезно, но архиважно. Учитывая, собственно, вопрос.

    А вопрос состоял в следующем. Вот у нас есть объекты, друг от друга наследуются, имплементируются и всё круто-прекрасно, но блджад. Зачем они нужны-то? Нет, не агрегация данных, хотя и она тоже. Нет, не агрегация реализации, хотя и она тоже. И нет, нет, не просто потому что. Хотя и это тоже... А вот подумай о такой ситуации. Есть библиотека. Да не важно какая, ну пусть это будет UI/UX. Вот есть абстрактный (!) класс кнопка. Почему абстрактный? Да потому что любая кнопка - это кнопка. Это как бы класс над классом. Кнопка может быть красной, может быть кликабельной, может становится не кликабельной после нажатия, может открывать диалог выбора файлов, а может закрывать приложение к чертям. В общем, много чего может уметь делать кнопка. И вот эту кнопку хочется поставить на формочку. И сделал создатель библиотеки такой прекрасный метод у формы PutAnyButtonHere(Button btn, Point xy). Но... Чёрт, чувак, мы должны передать объект класса Button, а у нас какой-нибудь наследник MyBestButton : BestAbstractLibraryButton, который наследник той самой Button. И у Button декларирован такой прекрасный метод TimeWhenUserClickOnMe(Point xy, AnotherInfo somethinElse), собственно... Получается, что где-то в недрах той самой библиотеки, когда автор прекрасной UI/UX библиотеки вызывает этот самый метод он должен вызвать НАШУ реализацию, а не реализацию BestAbstractLibraryButton. И уж точно не несуществующую реализацию Button (ибо метод там чисто-виртуальный). Идея виртуальных методов изначально именно в том, что есть особая таблица, которая хранит реализации отдельно, объекты отдельно, но когда мы пытаемся вызывать у объекта виртуальный метод происходит такая магия, которую принято называть поздним связыванием.

    А ключевые слова это просто для того, чтобы программист читая чужие полотна кода хоть ну немного имел возможность хоть как-то их понять. Что конкретно хотел программист в конкретной ситуации. И, если в Java все методы по дефолту виртуальные и ничерта не понятно из чужих полотен, хотел здесь программист позднее связывание, или это просто агрегация функционала, то в шарпе данной проблемы "как бы нет", язык порой чрезвычайно многословен на, казалось, такие банальности. Что в итоге изредка, но экономит чёртову тучу времени.

    Сухой остаток. Если мы вызываем виртуальный метод у объекта класса наследника некоторого супер-класса имея ссылку типа супер-класса, то вызывается реализация метода наследника. Если мы вызываем не виртуальный метод у объекта класса наследника некоторого супер-класса имея ссылку типа супер-класса, то вызывается реализация метода супер-класса. В остальном поведение тривиальное.

    Отсебятина. Не понимая данных вещей невозможно говорить, что принципы объектно-ориентированного программирования были усвоены. Советую прочитать "Философия Java" (вообще там Java скорее как язык для примеров, в общем-то ООП оно и в Африке ООП). Ну и пытаться разобраться в точке зрения любого человека, особенно если его компетенция хоть чем-то подтверждена (например, успешным трудоустройством).
    Ответ написан
    Комментировать
  • В каком разрешении рисовать макет на Retina?

    Aleksei_Segodin
    @Aleksei_Segodin
    арт директор / дизайнер
    Короткий ответ:
    не рисуйте в Фотошопе — рисуйте в Adobe XD. И все вопросы про dpi отпадут сами по себе.

    Более развёрнутый ответ:
    как правильно заметил GreatRash, dpi не имеет значения. Главное — кол-во пикселей. Да и то, с такими динамичными интерфейсами и адаптивными сайтами которые востребованы сегодня даже пиксели "сдают позиции" и делят место с %.

    Если отвечать на вопрос, то верстать нужно в том разрешении (в пикселях), которое показывает браузер. Например, если с обычными компьютерами все ясно: ширина экрана 1280px, значит и рисовать нужно в 1280. То с телефонами уже все не так очевидно. Например, физический размер экрана iPhone 6: 750x1334px. Но браузер на телефоне показывает сайт так как будто бы там вдвое меньше пикселей: 375x667px. То есть, если вы в макете нарисуете блок шириной 187px, то он займёт половину экрана на iPhone 6.
    Есть отличный сайт, который показывает размеры экранов самых популярных мобильных устройств:
    • их фактические размеры (первые две колонки)
    • и размеры, которые "понимает" браузер (3 и 4 колонки — это то, что вам надо).


    Почему Adobe XD? Потому что, зуб даю, через пару лет Adobe скажет:
    — Ребята, мы убираем из Фотошопа все фишки, которые раньше помогали вам делать дизайн сайтов. Верстайте их теперь в XD. А мы оставим фотошоп для фотографов и иллюстраторов.

    Дело в том, что Adobe XD — это их новая разработка для прототипирования (дизайна) сайтов. И разработка этой программы идёт полным ходом. Пока-что доступна только под Мак (к концу года будет Windows версия). В программе есть очень "вкусные" фишки, которые ускоряют работу в десятки раз. Посмотрите хотя бы эту GIF-ку ниже. А ещё сама программа очень быстро работает.

    xd-grid-animation-375x500.gif

    Есть еще Sketch. Он тоже создан специально для дизайна сайтов и только под Мак.
    Сначала может быть трудновато привыкнуть к дизайну без Фотошопа, но оно того стоит, поверьте.

    Философия:
    Что такое дизайн сайта? И зачем думать про разрешение? И зачем вообще мы их рисуем?
    После того как сайт сделан и проект закрыт, все PSD макеты дизайнера отправляются в архив и лежат там мертвым грузом десятки лет пока вы их не удалите. Рисунки никому не нужны — нужен сам сайт. А рисуем мы их для того, чтобы легче представить себе и показать верстальщику как сайт должен смотреться. То есть, если бы мы могли телепатически обьяснить верстальщику что и как должно выглядеть, то никто бы не занимался этой "ерундой" в Фотошопе. И это основная задача дизайнера: придумать как сайт должен выглядеть, анимироваться и взаимодействовать с юзером и передать это дальше в производство.

    И тут ваша идеальная работа, как дизайнера, должна выглядеть так:
    1. Вы рисуете страницу так как она должна выглядеть и выносите в отдельный документ (или слой) все размеры всех блоков, отступов, хедеров, футеров и пр. У вас должно получиться что-то вроде "чертежа" сайта с вашими комментариями;
    2. Затем, в отдельное место выносите дизайны всех кнопок, полей для ввода текста, стили заголовков, аккордеонов, вкладок и всего остального что есть на вашем сайте;
    3. Отдельно подготавливаете контент: текст и картинки. При этом желательно, чтобы картинки были сразу продублированы в нескольких размерах (в случае с адаптивными сайтами).
    4. Все иконки — тоже отдельно. Векторные, в формате SVG, плюс PNG — для подстраховки при вёрстке.

    Затем собираете это все в один портфель и несёте верстальщику. Он скажет вам большое спасибо и назовёт лучшим дизайнером в мире.

    Для примера, касательно пункта 1, посмотрите как я обычно оформляю ТЗ для верстальщика. Это только две страницы из 20-ти.

    01b4d706294b4363a976980638344a8c.png9a0bf90210c4469682e82cc1413c9843.png

    А эта работа, которую вы проделали — это не "дополнительный" труд. Это то как обычно выглядит хороший дизайн-процесс. Особенно, в больших студиях. Таким образом вы избавитесь от кучи мелких ошибок со стороны разработчиков и от необходимости разжёвывать все мелочи отвечая на их "глупые" вопросы.
    Ответ написан
    9 комментариев