Остерегайтесь побочных эффектов от реализации интерфейсов типами значений


Во всех приведенных до сих пор примерах было показано, как классы могут реализо-вывать методы интерфейсов. На самом деле типы значений также могут реализовывать интерфейсы. Однако при этом возникает один главный побочный эффект.

Приведение типа значений к интерфейсному типу вызывает упаковку. Хуже того, модификация значения через ссылку на интерфейс приводит к модификации упакованной копии, а не оригинала. Учитывая сложности, присущие упаковке, такое поведение может быть сочтено нежелательным.

Возьмем для примера System.Int32. Пожалуй, это один из самых базовых типов CLR. Однако следует отметить, что он реализует несколько интерфейсов: IComparable, IFormattable и IConvertible. Рассмотрим, к примеру, реализацию интерфейса IConvertible в System.Int32. Все методы реализованы явно. Интерфейс IConvertible имеет довольно много методов, но ни один из них не входит в общедоступный контракт System.Int32.

Чтобы вызвать один из его методов, понадобится сначала привести тип значений Int32 к ссылке на интерфейс IConvertible. И, конечно же, поскольку переменные типов интерфейсов являются ссылками, значение Int32 должно быть упаковано.

Отдавайте предпочтение классу Convert вместо интерфейса IConvertible
Несмотря на то что в качестве примера используется интерфейс IConvertible, реализованный типом значений, в документации не рекомендуется вызывать метод IConvertible на Int32, а вместо этого рекомендуется применять класс Convert.

Этот класс предоставляет коллекцию методов со многими перегрузками для распространенных типов, которые позволяют преобразовать одно значение почти в любое другое, включая пользовательские типы (с помощью Convert.ChangeType), что облегчает изменение кода в будущем.

Например, если имеется код:

1
2
int i = 0;
double d - Int32.ToDouble(i);

и необходимо изменить тип i на long, то также понадобится заменить тип Int32 на Int64. С другой стороны, если написать следующим образом:

1
2
int i = 0;
double d = Convert.ToDouble(i);

тогда все, что потребуется сделать — это изменить тип i.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100