Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.10.19;
Скачать: CL | DM;

Вниз

<> nil или Assigned()?   Найти похожие ветки 

 
Cobalt ©   (2014-03-04 14:06) [0]

Кто чем пользуется при проверке переменной на хранение объекта?
И чем аргументируете свой выбор?


 
Dimka Maslov ©   (2014-03-04 14:12) [1]

И так и так под настроение


 
brother ©   (2014-03-04 14:17) [2]

<> nil. использую freeAndnil или ручное присвоение удаленному объекту nil


 
brother ©   (2014-03-04 14:18) [3]

<> nil имхо читаемо лучше...


 
MonoLife ©   (2014-03-04 14:25) [4]

> brother ©   (04.03.14 14:17) [2]
аналогично


 
Германн ©   (2014-03-04 14:26) [5]


> проверке переменной на хранение объекта

Никогда не проверял. Сами собой у меня объекты не суицидировали. :)


 
antonn ©   (2014-03-04 14:32) [6]


>
> Никогда не проверял. Сами собой у меня объекты не суицидировали.
>  :)

события


 
Ega23 ©   (2014-03-04 14:51) [7]


> Кто чем пользуется при проверке переменной на хранение объекта?


Объекта - как правило <> nil
Процедурные типы - ну тут сам Дед Вирт велел Assigned использовать.


 
Ega23 ©   (2014-03-04 14:52) [8]


> antonn ©   (04.03.14 14:32) [6]
>
> события


событие - не объект. :)


 
Inovet ©   (2014-03-04 14:53) [9]

> [6] antonn ©   (04.03.14 14:32)
> события

Пришло событие, которому нужен объект, а объект уже того?


 
Ega23 ©   (2014-03-04 15:20) [10]


> Пришло событие, которому нужен объект, а объект уже того?




type

 TMyClass = class
 private
   FOnFooEvent: TNotifyEvent;
 public
   procedure Foo;
   property OnFooEvent: TNotifyEvent read FOnFooEvent write FOnFooEvent;
 end;

procedure TMyClass.Foo;
begin
 if Assigned(FOnFooEvent) then
   FOnFooEvent(Self);
end;


 
Inovet ©   (2014-03-04 15:38) [11]

> [10] Ega23 ©   (04.03.14 15:20)

Это я из предыдущего понял, тогда назначенные обработчики событий. Вопрос о том, что в самих событиях проверять на nil.


 
clickmaker ©   (2014-03-04 15:43) [12]

> [11] Inovet ©   (04.03.14 15:38)

если объект типа TMyClass вызвал событие, значит он всяко жив еще. Тут же не PostMessage


 
Ega23 ©   (2014-03-04 15:44) [13]


> Вопрос о том, что в самих событиях проверять на nil.


В самих, как правило, if Sender <> nil


 
Ega23 ©   (2014-03-04 15:50) [14]


> если объект типа TMyClass вызвал событие, значит он всяко
> жив еще. Тут же не PostMessage



type

 TMyClass = class
 private
   FOnFooEvent: TNotifyEvent;
 public
   procedure Foo;
   property OnFooEvent: TNotifyEvent read FOnFooEvent write FOnFooEvent;
 end;

 TForm10 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   procedure OnFoo(Sender: TObject);
 public
   { Public declarations }
 end;

var
 Form10: TForm10;

implementation

{$R *.dfm}

{ TMyClass }

procedure TMyClass.Foo;
begin
 if Assigned(FOnFooEvent) then
   FOnFooEvent(Self);
end;

procedure TForm10.Button1Click(Sender: TObject);
begin
 with TMyClass.Create do
   try
     OnFooEvent := OnFoo;
     Foo;
   finally
     Free;
   end;
end;

procedure TForm10.Button2Click(Sender: TObject);
begin
 OnFoo(nil);  //    <- пиндык, AV
end;

procedure TForm10.OnFoo(Sender: TObject);
begin
 ShowMessage(Sender.ClassName);
end;

end.



 
УАЗ Патриот   (2014-03-04 15:54) [15]

nil для указателей и объектов, Assigned для событий (так читабельнее)


 
antonn ©   (2014-03-04 16:21) [16]


> Inovet ©   (04.03.14 15:38) [11]

я про то что Ega написал

кстати, несколько напрягает меня assigned, потому что есть assign, и они оба в выпадающем списке автоподстановок D7 значатся как procedure (это как "звОнит" и "звонИт", вроде запомнил, потом все равно пытаешься вспомнить как тебе твердили правильное звучание, и часто неверно вспоминаешь :) ). приходится тыкнуть куда нибудь в системный юнит, и посмотреть там


 
Inovet ©   (2014-03-04 16:25) [17]

> [12] clickmaker ©   (04.03.14 15:43)

> [13] Ega23 ©   (04.03.14 15:44)

Не то. В обработчике события

if ChoToTam <> nil then
 работаем с ChoToTam
else
 MessageBox("Простите, но ChoToTam почему-то нет. Попробуйте ещё, может быть, когда-нибудь получится.")
end

как-то неправильно. Другое дело

if not ChoToTam.IsPokaChtoPustoi then
 работаем с содержимым ChoToTam
else
 MessageBox("В ChoToTam-е пока ничего нет. Добавьте в ChoToTam то, что надо, и попробуйте ещё раз, тогда что-будь получится.")
end


 
clickmaker ©   (2014-03-04 16:28) [18]

> [14] Ega23 ©   (04.03.14 15:50)

ну, против лома нет приема, как известно )


 
Ega23 ©   (2014-03-04 20:34) [19]


> ну, против лома нет приема, как известно )


Однако, на раннем этапе Дао такой код регулярно встречался. Что-то типа Action1.Execute(nil);


 
Rouse_ ©   (2014-03-04 21:15) [20]


> И чем аргументируете свой выбор?

Использую только в тех случаях когда "<> nil" выполнить нельзя.
Аргументация простая - лень Assigned() набирать, многа букф...


 
Rouse_ ©   (2014-03-04 21:17) [21]

Кстати, Вовчь - встречный вопрос, а чем отличается Assigned() от "<> nil" ?


 
Rouse_ ©   (2014-03-04 21:18) [22]

ЗЫ: и до кучи - что есть Assigned() с точки зрения компилера :)


 
Плохиш ©   (2014-03-04 21:28) [23]


>  <> nil или Assigned()?
>
> Cobalt ©   (04.03.14 14:06) 
> Кто чем пользуется при проверке переменной на хранение объекта?
>
> И чем аргументируете свой выбор?

С уч&#235;том, что Assigned проверяет переменную на nil, вопрос - тупая попытка развести на холивар.

> Пришло событие, которому нужен объект, а объект уже того?

Кто-то гарантирует обниление всех указателей на объект?

PS. Проверка на nil, любым способом, не заменяет обработку исключений.


 
Inovet ©   (2014-03-04 21:33) [24]

> [23] Плохиш ©   (04.03.14 21:28)

Так а я об чём.


 
bems ©   (2014-03-04 21:42) [25]

если проверка только на неравенство nil, то Assigned
если есть и ветка then и ветка else то if Inst = nil then foo else bar;


 
DVM ©   (2014-03-04 21:54) [26]

И то и другое компилируется в абсолютно идентичный код сравнения с 0


 
[ВладОшин] ©   (2014-03-05 00:51) [27]

угу

Unit1.pas.30: if assigned(b1) then
0044E1C4 83B8FC02000000   cmp dword ptr [eax+$000002fc],$00
0044E1CB 7410             jz +$10

Unit1.pas.31: if b2 <> nil then
0044E1CD 83B80003000000   cmp dword ptr [eax+$00000300],$00
0044E1D4 7407             jz +$07


 
[ВладОшин] ©   (2014-03-05 00:53) [28]

как грится, найди отличия

Unit1.pas.30: if assigned(b1) then
0044E1C7 83BBFC02000000   cmp dword ptr [ebx+$000002fc],$00

Unit1.pas.32: if integer(b1) <> 0 then
0044E1D7 83BBFC02000000   cmp dword ptr [ebx+$000002fc],$00


 
Несусвет   (2014-03-05 01:20) [29]

Всегда использую Assigned(), мне по телевизору так сказали, а я чё? Я ни чё.


 
Дмитрий СС   (2014-03-05 03:18) [30]

Assigned только для проверки инициализации полей объекта. Тех что по умолчанию обниленные при создании объекта. Например, когда требуется инициализация поля по требованию.

Во всех остальных случаях =nil.

По-моему функция assigned для этого и предназначена.


 
Ega23 ©   (2014-03-05 07:12) [31]


> Всегда использую Assigned(), мне по телевизору так сказали, а я чё?


Это сурковская пропаганда.


 
icWasya ©   (2014-03-05 09:56) [32]

Разница будет в таком случае

Type
TFunc = function:TObject;

Var
Func:TFunc;

if Assigned(Func) then // здесь будет проверка
                               // что Func не расво nil

if Func <> Nil then // а здесь без проверки будет вызвана функция
                          // и на Nil будет проверяться результат :(  


 
clickmaker ©   (2014-03-05 10:06) [33]

> Что-то типа Action1.Execute(nil);

Это когда программеру лень вынести код, который может выполняться как при событии, так и обособленно, в отдельную процедуру.
В принципе порочная практика, оправдываемая только авральным режимом кодирования.


 
Ega23 ©   (2014-03-05 10:44) [34]


> Это когда программеру лень вынести код, который может выполняться
> как при событии, так и обособленно, в отдельную процедуру.
>
> В принципе порочная практика, оправдываемая только авральным
> режимом кодирования.

Не спорю. Даже с авральным кодированием не согласен, всегда надо выносить.
Но приходит это дело только с опытом.


 
Игорь Шевченко ©   (2014-03-05 12:05) [35]

Использую Assigned, удобно при проверке переменных, хранящих указатели на код.


 
Владислав ©   (2014-03-05 13:05) [36]

Assigned.
Шеф сказал использовать Assigned. :)


 
Владислав ©   (2014-03-05 23:29) [37]

Добавлю...
До того, как... использовал <> nil.
После того, как шеф сказал "Assigned", его и использую. После объяснения проникся.


 
Cobalt ©   (2014-03-07 10:34) [38]

Я почему спрашивал:
1) Лень набирать целую процедуру
2) Мне кажется, что уж для объектов/указателей более ясно - одно дело когад проверяется результат какой-то функции, а другое - когда сразу видна проверка на nil - глаз за него цепляется (ключевое слово ж, выделяется шрифтом)

Эх, если б разработчики и Assigned сделали б ключевым словом, чтобы выделялось - можно было б спокойно перейти на такое однообразное использование, а то сейчас в коде как попало :(


 
DVM ©   (2014-03-07 10:36) [39]


> Эх, если б разработчики и Assigned сделали б ключевым словом,
>  чтобы выделялось

CnPack ставь и выделяй чего угодно


 
RWolf ©   (2014-03-07 11:23) [40]


> icWasya ©   (05.03.14 09:56) [32]

Вариант с <>nil ещё и экономнее получается:
Unit1.pas.37: if @method<>nil then
004AEAA0 833D34B84B0000   cmp dword ptr [method],$00

Unit1.pas.39: if Assigned(method) then
004AEAB3 66833D36B84B0000 cmp word ptr [method + $2],$00



> Владислав ©   (05.03.14 23:29) [37]
> Добавлю...До того, как... использовал <> nil.После того,
>  как шеф сказал "Assigned", его и использую. После объяснения
> проникся.

А какое было объяснение?



Страницы: 1 2 вся ветка

Текущий архив: 2014.10.19;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.009 c
15-1394127366
0xC0DE
2014-03-06 21:36
2014.10.19
Удалить одну из установленных ОС


1-1328363110
ololo
2012-02-04 17:45
2014.10.19
Как максимально оптимизировать(убыстрить) этот участок кода?


15-1393955183
Tirael
2014-03-04 21:46
2014.10.19
Как получить массив (одномерный, но с неизвестным колвом) по OLE?


6-1273586253
istok
2010-05-11 17:57
2014.10.19
TLS library initialization failure...


8-1235584920
dron9999
2009-02-25 21:02
2014.10.19
помогите с компонентом