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

Показаны сообщения с ярлыком теория. Показать все сообщения
Показаны сообщения с ярлыком теория. Показать все сообщения

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

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

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

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

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

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

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

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

вторник, 25 сентября 2012 г.

Сравнение: const vs readonly

Таблица различий между полем-константой и полем только-для-чтения в C#
Аспект const readonly
Место инициализации Только при объявлении поля. При объявлении поля, в конструкторах экземпляра, в статическом конструкторе.
Время инициализация При компиляции. При создании экземпляра класса или при обращении к статическим членам класса.
Поддерживаемые типы Boolean, Char, Byte, SByte, Intl6, UIntl6, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, String и enum. Использовать ссылочные типы как константы не имеет смысла, т. к. единственное допустимое начальное значение таких констант — null. Исключение — тип String. Любой тип.
Способ хранения Хранится в метаданных сборки. Везде, где встречается константа, компилятор вставляет вместо неё само значение. В период выполнения память для неё не выделяется. Хранится как обычное (instance) поле с выделением памяти в период выполнения.
Разделение между сборками Везде, где встречается константа, определённая в другой сборке, компилятор вставляет вместо неё само значение из сборки. После компиляции, сборка с константой более не требуется для выполнения приложения (при условии, что используется только константа). Если константа будет изменена, то для использования нового значения в других сборках потребуется их перекомпиляция. Разделяется как обычное поле. Сборка с reaonly полем должна присутствовать в списке ссылок у сборок-клиентов.

Источники

  1. http://msdn.microsoft.com/ru-ru/library/acdd6hb7.aspx.
  2. Дж. Рихтер. CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#. – С. 191.

среда, 19 сентября 2012 г.

Сравнение: abstract class vs interface

Представляю вольный и дополненный перевод таблицы из статьи на CodeProject.

Таблица различий между абстрактным классом и интерфейсом в C#

Аспект abstract class interface
Назначение Как любой базовый класс, представляет ядро поведения для всех наследников. Если в абстрактном классе не реализован ни один метод, имеет смысл превратить его в интерфейс. Контракт, ничего более. Интерфейсы часто используются (и во основном предназначены для этого) как примеси без реализации при проектировании иерархии классов.
Реализация по умолчанию Может быть частично или полностью реализован, предоставлять базовую функциональность. Не может содержать какой-либо код.
Модификаторы доступа членов Члены могут иметь все допустимые модификаторы доступа. Только public.
Наследование Наследование от абстрактного класса реализует отношение "является". Наследование от интерфейса определяет отношение "реализует".
Множественное наследование Класс может наследовать только один класс. Класс может наследовать несколько интерфейсов. При этом он может и не реализовывать методы интерфейса, т. е. быть абстрактным. Сам интерфейс тоже может наследовать несколько интерфейсов.
Скорость Быстро. Требуется больше времения для поиска реализованного метода в соответствующем классе.
Расширение При добавлении нового метода в абстрактный класс, мы можешь реализовать его, тем самым не нарушив работу наследующих классов. Если тело метода оставить нереализованным, потребуется его реализация в классах-наследниках с последующей перекомпиляцией. При добавлении нового метода в интерфейс мы должны определить его во всех классах, реализующих интерфейс, с перекомпиляцией.
Члены Может содержать все допустимые члены. Не может содержать константы, поля, операторы, конструкторы экземпляров, деструкторы или типы. Допускаются: методы, свойства, события, индексаторы (свойства с параметрами).
Статические члены Может содержать статические поля и методы. Не может содержать статические поля и методы.

Источники

  1. http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface
  2. http://msdn.microsoft.com/ru-ru/library/ms173156.aspx
  3. Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. Приемы ООП. Паттерны проектирования.
  4. Дж. Рихтер. CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#. — С. 322.
  5. Дж. Либерти. Программирование на C#.