Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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) 
> Кто чем пользуется при проверке переменной на хранение объекта?
>
> И чем аргументируете свой выбор?

С уч&#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;
Скачать: [xml.tar.bz2];

Наверх





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


2-1383130618
Vvasja
2013-10-30 14:56
2014.10.19
Программа поиска для Win7


15-1394470373
robt5
2014-03-10 20:52
2014.10.19
изменение памяти чужого процесса


2-1383035938
Den
2013-10-29 12:38
2014.10.19
У кого такое было с pop3. Зависает.


15-1394114961
Друг
2014-03-06 18:09
2014.10.19
Помогите с правилами XML





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский