Форум: "Прочее";
Текущий архив: 2014.10.19;
Скачать: [xml.tar.bz2];
Вниз<> 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)
> Кто чем пользуется при проверке переменной на хранение объекта?
>
> И чем аргументируете свой выбор?
С учëтом, что 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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.003 c