Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2016, 11:24   #11
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

А почитать про эти операторы? чтобы понять разницу
come-on вне форума Ответить с цитированием
Старый 16.02.2016, 12:10   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
А почитать про эти операторы? чтобы понять разницу
дык вроде бы читал.
Теперь хочу у знающих людей переспросить.

http://docwiki.embarcadero.com/RADSt...ass_References
Цитата:
Class Operators

Class methods operate on class references. Every class inherits two class methods from TObject, called ClassType and ClassParent. These methods return, respectively, a reference to the class of an object and to the immediate ancestor class of an object. Both methods return a value of type TClass (where TClass = class of TObject), which can be cast to a more specific type. Every class also inherits a method called InheritsFrom that tests whether the object where it is called descends from a specified class. These methods are used by the is and as operators, and it is seldom necessary to call them directly.

The is Operator
The is operator, which performs dynamic type checking, is used to verify the actual runtime class of an object. The expression:
object is class
returns True if object is an instance of the class denoted by class or one of its descendants, and False otherwise. (If object is nil, the result is False.) If the declared type of object is unrelated to class -- that is, if the types are distinct and one is not an ancestor of the other -- a compilation error results. For example:
Код:
 if ActiveControl is TEdit then TEdit(ActiveControl).SelectAll;
This statement casts the ActiveControl variable to the TEdit type. First it verifies that the object referenced by ActiveControl is an instance of TEdit or one of its descendants.

The as Operator
The as operator performs checked typecasts. The expression
object as class
returns a reference to the same object as object, but with the type given by class. At run time, object must be an instance of the class denoted by class or one of its descendants, or be nil; otherwise an exception is raised. If the declared type of object is unrelated to class - that is, if the types are distinct and one is not an ancestor of the other - a compilation error results. For example:

Код:
 with Sender as TButton do
  begin
   Caption := '&Ok';
   OnClick := OkClick;
  end;
The rules of operator precedence often require as typecasts to be enclosed in parentheses. For example:
Код:
 (Sender as TButton).Caption := '&Ok';
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.02.2016, 12:14   #13
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Ну так что тогда не понятно?
ас проверку делает, а зачем вам 2 проверки да еще и такие дорогие?
come-on вне форума Ответить с цитированием
Старый 16.02.2016, 12:48   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

http://www.transl-gunsmoker.ru/2010/...g-post_10.html
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.02.2016, 13:14   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Аватар, отдельное спасибо за ссылочку, имхо весьма полезно.

Теперь понятно, в чём здесь головная боль
кстати от GunSmoker'а, (по ссылке Аватара)
// выделение моё:

Цитата:
Вопросы производительности
В Win32 существуют небольшие накладные расходы на is- и as-проверки - потому что компилятору и RTL нужно пройтись по дереву наследования,
чтобы проверить соответствие класса.
В большинстве случаев это очень незначительная добавка, которую можно игнорировать.
Часто вам требуется сконвертировать объектную ссылку в конкретный тип, но вы хотите избежать исключения, поэтому вы пишете:
Код:
if Instance is TMyClass then
  MyObject := Instance as TMyClass;
Эта конструкция часто не нравится некоторым программистам Delphi - они указывают на то, что as повторно выполняет проверку, которая уже была сделана is.
В большинстве случаев это не имеет никакого значения, но если вы хотите, то можете переписать этот код так
:
Код:
if Instance is TMyClass then
begin
  MyObject := TMyClass (Instance);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.02.2016, 13:58   #16
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

а можно и так
Цитата:
if Instance is TMyClass then
MyObject := Instance as TMyClass;
if MyObject = nil then
...
по всякому можно

Последний раз редактировалось come-on; 16.02.2016 в 14:24.
come-on вне форума Ответить с цитированием
Старый 16.02.2016, 14:19   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
а можно и так
ну, так как раз нельзя!
(у Вас в коде нет начального присвоения MyObject, да и проверку на = nil лучше заменить на Assigned(MyObject)).


Но это всё уж не важно, дальше обсуждение можно уже и не продолжать, я понял, что конкретно имел в виду northener в пост #8
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.02.2016, 14:24   #18
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

с чего это нельзя? начальные инициализации и т.п. просто опустим, можно еще операторными скобками , раз такое дело, не про то речь

Последний раз редактировалось come-on; 16.02.2016 в 14:26.
come-on вне форума Ответить с цитированием
Старый 17.02.2016, 00:28   #19
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Но это всё уж не важно, дальше обсуждение можно уже и не продолжать, я понял, что конкретно имел в виду northener в пост #8
Ну тогда ещё одно замечание. Я лично не вижу смысла в использовании оператора AS. Не, ну против его существования я не возражаю. Но вот где его использование необходимо или хотя бы желательно?
Если мы не знаем класс объекта, ссылка на который у нас имеется, то грамотнее всего выполнить проверку оператором IS, а потом уж выполнять некие действия в зависимости от результата проверки.
Если же мы точно знаем класс объекта, ссылку на который мы имеем (например у нас общий обработчик для нескольких кнопок), то зачем нам вообще нужна проверка класса? Ну разве что мы настолько невнимательны, что приписали этот обработчик какому-то компоненту другого класса. И на этапе отладки мы можем не сразу это увидеть.
Имхо тут бы лучше было бы делать проверку класса при прямом приведении типов, но только при включенной некоей опции компилятора.
P.S. Хотя это несбыточные мечты. Компилятором Дельфи уже давно никто особо не занимается.
northener вне форума Ответить с цитированием
Старый 18.02.2016, 16:37   #20
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Я лично не вижу смысла в использовании оператора AS. Не, ну против его существования я не возражаю. Но вот где его использование необходимо или хотя бы желательно?
Код:
procedure GoodTest (F: TObject);
begin
  (F as TMyObject).DoSomfing;
end;

procedure BadTest (F: TObject);
begin
  if F is TMyObject then
    TMyObject(F).DoSomfing
  else
    raise EInvalidCast.Create('Invalid class typecast');
end;
AS = IS + Raise Error + Type Casts
Нужны по отдельности - пишем сами по отдельности. Нужны вместе и сразу - используем AS.

Не забывайте, что приложения иногда разрабатываются командно, на разных ЯП, разработка растянута во времени, код может попасть в библиотеку. Да мало-ли. Ваш код должен вести себя адекватно в любой ситуации.

Последний раз редактировалось Sibedir; 18.02.2016 в 16:44.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение из case 1 в case 2(switch(), язык Си) Павел_95 Помощь студентам 13 11.01.2013 14:18
с++.switch-case счетчик. не работает программа. Leeto Помощь студентам 0 22.12.2011 13:17
Не работает CASE для NULL в выборке из view (скриншот внутри Ivan_32 SQL, базы данных 2 12.04.2011 22:16
sender as.. nark03 Помощь студентам 2 18.01.2009 16:13
Конструкция case of работает некорректно! Как исправить? SkAndrew Общие вопросы Delphi 6 06.04.2008 00:21