Программирование

понедельник, 3 марта 2014 г.

Сравнение: event vs delegate

И делегаты, и события позволяют реализовать шаблон проектирования Наблюдатель. В чём же различие? Если в одном предложении, то событие — это надстройка на делегатом, которая сильно урезает его "в правах".
  1. Событие нельзя объявить свойством, только полем. Однако событие поддерживает определение своих методов подписки и отписки (add и remove) в стиле свойств.
  2. Реализация подписки и отписки на событие потокобезопасна (речь идёт о штатных методах add и remove).
  3. Полю события нельзя присвоить null вне другого класса. Вообще, стороннему коду нельзя ничего сделать с полем события кроме как подписаться или отписаться. Для этого используются операторы += и -=, которые транслируются в вызов add и remove. Оператор = к событиям не применим.
  4. Запускать событие напрямую можно только в том классе, в котором оно объявлено. Даже в потомках нельзя. Однако это можно сделать через метод-обёртку.
По мотивам топика на Хабре.

пятница, 28 февраля 2014 г.

Ошибка в переводном 4-м издании "CLR via C#" Рихтера

В примере кода, который находится в разделе "Уведомление о событии, безопасное в отношении потоков" (с. 291), использован устаревший метод Thread.VolatileRead() вместо Volatile.Read().

В оригинальном издании всё правильно — везде используется Volatile.Read(). В разделе упоминания этих методов чередуются, так что судя по всему это результат "недоправки" листингов с предыдущих изданий. Больше нигде в книге Thread.VolatileRead() не упоминается. Про Thread.VolatileRead() и Volatile.Read() можно начать читать отсюда.

вторник, 11 февраля 2014 г.

Неработающий XAML-дизайнер Visual Studio 2013 в проекте для Windows Store

При попытке запуска дизайнера XAML-страницы проекта для Windows Store получаю такое исключение:

System.Runtime.InteropServices.COMException
Это приложение не поддерживает указанный контракт или не установлено. (Exception from HRESULT: 0x80270254)

Для информации: среда разработки Visual Studio 2013 Ultimate установлена на Windows 8.1 Pro x64.

Это ошибка появляется при открытии дизайнером XAML-страницы именно для Windows Store. В обычном WPF-проекте ошибки нет, в проекте для Windows Phone — тоже. Начал гуглить. Чтение форумов не помогло. Сделал Repair установки — ошибка не исчезла. Видимо, дело не в повреждённых файлах или настройках.

Моя рабочая учётная запись (в которую я обычно загружаюсь) имеет права рядового пользователя Windows 8. Среду Visual Studio 2013 я привык запускать с правами администратора. Например, чтобы иметь возможность присоединяться к процессу IIS для отладки.

По опыту знаю, что запуск программы с правами администратора — это не одно и тоже, что и запуск программы в загруженной учётной записи администратора. Поэтому решил загрузиться в учётную запись администратора и открыть дизайнер там. Дизайнер открылся без ошибок. Это меня расстроило, т. к. мне не хотелось всякий раз загружаться как администратор, когда мне необходимо программировать. На всякий случай решил попробовать открыть дизайнер в студии, запущенной в рабочей учётной записи без дополнительных привелегий. Дизайнер открылся без ошибки! Такое поведение для меня выглядит странным. Другого решения я не нашёл. Установка Update 1 для VS 2013 не помогла. Если у кого-то в такой же ситуации дизайнер работает без ошибок, был бы признателен за отклик.

понедельник, 10 февраля 2014 г.

Доступ к непубличным экземплярным полям класса

К непубличным экземплярным полям класса можно обращаться из другого экземпляра того же класса. Следующий код компилируется без проблем.
class PrivateFieldsAccess
{
    private int privateField;
    protected int protectedField;

    public PrivateFieldsAccess(PrivateFieldsAccess instance)
    {
        privateField = instance.privateField;
        protectedField = instance.protectedField;
    }

}
Модификаторы доступа определяют доступ к членам класса, а не экземпляра. Другими словами, ограничение доступа к членам класса служит для инкапсуляции и снижения зависимости между кусками кода, а не снижения зависимости объектов в памяти во время выполнения.