![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Классы!
WondeRu © (2004-08-12 12:42:00)Здравствуйте!
Чем отличается следующий код? и где, что лучше применять?
1.
(Sender as TPanel).Handle
2.
TPanel(Sender).Handle
Код Делфа генерит разный!!!
Заранее спасибо!
KSergey (2004-08-12 13:23:00) [21]> [5] _student (12.08.04 13:21)
Да, да
Запостил, потом подумал ;)
KSergey (2004-08-12 13:22:00) [22]> [4] KSergey © (12.08.04 13:17)
> - по-моему понятно: если есть полная уверенность, что некая
> переменная в данном месте программы точно указанного типа
> либо его наследник - то можно применять второе; если такой
> уверенности нет - первое (важно делать надежные программы).
Читать так:
если есть полная (гарантированная!) уверенность, что некая переменная содержит ссылку на объект того же класса, к котрому приводится или его наследника - то можно применять второе;
и далее по тексту.
_student (2004-08-12 13:21:00) [23]
> KSergey © (12.08.04 13:17) [4]
если типы объектов ....
KSergey (2004-08-12 13:17:00) [24]> [2] wicked © (12.08.04 12:59)
> в общем, совет: если нужно обратиться к свойству типа Handle
> или ClientRect, то кастить такой указатель лучше к классу,
> в котором это свойство и обьявлено... в данном случае это
> TWinControl...
По поводу общности совета совершенно не согласен.
> _student (12.08.04 12:57)
Извините - бред. Т.е. as всегда вызывает исключительную ситуацию, я правильно понял? (так написано!)
(традиционной и не традиционной бывает секссуальная ориентация)
Ну чем отличается - сказал wicked, е по поводу где применять - по-моему понятно: если есть полная уверенность, что некая переменная в данном месте программы точно указанного типа либо его наследник - то можно применять второе; если такой уверенности нет - первое (важно делать надежные программы).
А вообще - ну в книжках это все есть.
Да и недавно отгремела огромная вполне любопытная ветка по is. Думаю, к as это тоже относится.
QQ (2004-08-12 13:14:00) [25]В первом случае вызывается дополнительно процедура
@AsClass,
которая проверяет, является лиSenderобъектом класса TPanel или его наследника (если не является - генерируется исключение).
Первый вариант предпочтительнее, если речь не идёт о быстродействии. В любом случае лучше заранее проверитьSenderна соответствие:if Sender is TPanel then ...
wicked (2004-08-12 12:59:00) [26]1. выполняется проверка на то, является ли Sender экземпляром TPanel или её наследников... и если вдруг Sender окажется экземпляром TButton, наступит исключение...
2. ничего не проверяется, так что если Sender окажется экземпляром TButton, то и компилятор сгенерирует код, ведущий себя с Sender как с TButton...
на самом деле не так всё однозначно, поскольку в коде идёт обращение к свойству, общему и для TPanel, и для, скажем, TButton, поскольку обьявлено оно в общем предке - TWinControl... поэтому в данном случае катастрофы не будет...
но если вдруг в Sender окажется экземпляр, скажем, TList, то второй вариант уже чреват серьезными глюками...
в общем, совет: если нужно обратиться к свойству типа Handle или ClientRect, то кастить такой указатель лучше к классу, в котором это свойство и обьявлено... в данном случае это TWinControl...
_student (2004-08-12 12:57:00) [27]"Разница между традиционными преобразованиями типов и использования операции as заключается в том, что последний вызывает исключительную ситуацию."
М.К.