- Событие нельзя объявить свойством, только полем. Однако событие поддерживает определение своих методов подписки и отписки (add и remove) в стиле свойств.
- Реализация подписки и отписки на событие потокобезопасна (речь идёт о штатных методах add и remove).
- Полю события нельзя присвоить null вне другого класса. Вообще, стороннему коду нельзя ничего сделать с полем события кроме как подписаться или отписаться. Для этого используются операторы += и -=, которые транслируются в вызов add и remove. Оператор = к событиям не применим.
- Запускать событие напрямую можно только в том классе, в котором оно объявлено. Даже в потомках нельзя. Однако это можно сделать через метод-обёртку.
Программирование
Показаны сообщения с ярлыком теория. Показать все сообщения
Показаны сообщения с ярлыком теория. Показать все сообщения
понедельник, 3 марта 2014 г.
Сравнение: event vs delegate
И делегаты, и события позволяют реализовать шаблон проектирования Наблюдатель. В чём же различие? Если в одном предложении, то событие — это надстройка на делегатом, которая сильно урезает его "в правах".
понедельник, 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 полем должна присутствовать в списке ссылок у сборок-клиентов. |
Источники
- http://msdn.microsoft.com/ru-ru/library/acdd6hb7.aspx.
- Дж. Рихтер. CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#. – С. 191.
среда, 19 сентября 2012 г.
Сравнение: abstract class vs interface
Представляю вольный и дополненный перевод таблицы из статьи на CodeProject.
Таблица различий между абстрактным классом и интерфейсом в C#
| Аспект | abstract class | interface |
| Назначение | Как любой базовый класс, представляет ядро поведения для всех наследников. Если в абстрактном классе не реализован ни один метод, имеет смысл превратить его в интерфейс. | Контракт, ничего более. Интерфейсы часто используются (и во основном предназначены для этого) как примеси без реализации при проектировании иерархии классов. |
| Реализация по умолчанию | Может быть частично или полностью реализован, предоставлять базовую функциональность. | Не может содержать какой-либо код. |
| Модификаторы доступа членов | Члены могут иметь все допустимые модификаторы доступа. | Только public. |
| Наследование | Наследование от абстрактного класса реализует отношение "является". | Наследование от интерфейса определяет отношение "реализует". |
| Множественное наследование | Класс может наследовать только один класс. | Класс может наследовать несколько интерфейсов. При этом он может и не реализовывать методы интерфейса, т. е. быть абстрактным. Сам интерфейс тоже может наследовать несколько интерфейсов. |
| Скорость | Быстро. | Требуется больше времения для поиска реализованного метода в соответствующем классе. |
| Расширение | При добавлении нового метода в абстрактный класс, мы можешь реализовать его, тем самым не нарушив работу наследующих классов. Если тело метода оставить нереализованным, потребуется его реализация в классах-наследниках с последующей перекомпиляцией. | При добавлении нового метода в интерфейс мы должны определить его во всех классах, реализующих интерфейс, с перекомпиляцией. |
| Члены | Может содержать все допустимые члены. | Не может содержать константы, поля, операторы, конструкторы экземпляров, деструкторы или типы. Допускаются: методы, свойства, события, индексаторы (свойства с параметрами). |
| Статические члены | Может содержать статические поля и методы. | Не может содержать статические поля и методы. |
Источники
- http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface
- http://msdn.microsoft.com/ru-ru/library/ms173156.aspx
- Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. Приемы ООП. Паттерны проектирования.
- Дж. Рихтер. CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#. — С. 322.
- Дж. Либерти. Программирование на C#.
Подписаться на:
Сообщения (Atom)