Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Assigned или <> nil [D6, 2000, XP, 2003]


НиколайКо ©   (2007-02-01 17:01:00) 

Нужно дорабатывать чужую программу, а в ней куча проверок в одних случаях
if Assigned(объект) then

в других
if объект <> nil then

Я пока не улавливаю разницу между этими проверками.
Подскажите в каких случая какую более правильно использовать, и какая работает быстрее.

Спасибо за внимание.


_uw_   (2007-02-04 15:16:00) [1]

Тьфу ты! И с "<>" тоже все хорошо.


_uw_   (2007-02-04 14:55:00) [2]

Странно, что с "= " работает, а с "<>" - нет.


_uw_   (2007-02-04 14:51:00) [3]

Игорь Шевченко ©   (01.02.07 17:05) [1]
работает одинаково. а вот ссылки на функции через <> nil не проверишь

procedure TForm1.FormCreate(Sender: TObject);

 function Int(X: Integer): Integer;
 begin
   Result := 1;
 end;

var
 f: function(i: Integer): Integer;
begin
 f := nil;
 if @f = nil then
   f := @Int;
 if @f = nil then
   f := @Int;
 f(2);
end;


DrPass   (2007-02-02 21:46:00) [4]


>к not

к nil


DrPass   (2007-02-02 21:46:00) [5]


> Разница в том, что данный программист не знаком с оператором
> NOT

Есть более оптимистичный вариант - тот код могли писать два программиста. У одного душа лежала к Assigned, у другого - к not


jack128   (2007-02-02 20:13:00) [6]

НиколайКо   (01.02.07 17:01)
Я пока не улавливаю разницу между этими проверками.


Сравни и почувствуй разницу:

procedure TForm2.FormCreate(Sender: TObject);
begin
 if Assigned(OnClick) then
   OnClick(nil);
 if OnClick <> nil then
   OnClick(nil)
end;


begin...end   (2007-02-02 19:34:00) [7]

> sinys ©   (02.02.07 19:28) [13]

Вы написали два варианта, которые вообще дадут разный результат: если условие Assigned(объект) истинно, то условие not (объект <> nil) будет ложным. Поэтому непонятно, зачем их сравнивать по времени выполнения. Впрочем, Ваши два варианта тоже будут работать практически одинаково быстро.


sinys   (2007-02-02 19:28:00) [8]


>  if Assigned(объект) и if объект <> nil

разве я написал так?


begin...end   (2007-02-02 19:11:00) [9]

> sinys ©   (02.02.07 19:02) [11]

Варианты кода if Assigned(объект)и if объект <> nilработают одинаково быстро.


sinys   (2007-02-02 19:02:00) [10]

Однако следует согласиться, что
if Assigned(объект) then
работает быстрее, чем
if not(объект <> nil) then

:)))

может тот программер мега оптимизатор?:)


Сергей М.   (2007-02-02 17:09:00) [11]

С др. стороны, стоит задуматься, что скрывается под "объект" во фразе

if объект<> nil then

Если тот прогарммер не такой уж и "долбаный", у него, вполне возможно, был резон написать именно так ...


НиколайКо   (2007-02-02 16:56:00) [12]


> Сергей М.

;) это хорошо, что заставил задуматься. Это означает, что есть чем думать.


Сергей М.   (2007-02-02 16:27:00) [13]


> НиколайКо


Кстати, и ты вправе "проклянуть" того самого "долбаного программера", который заставил тебя задуматься над этой хренью)


Сергей М.   (2007-02-02 16:24:00) [14]


> НиколайКо   (02.02.07 16:21) [6]


По колено горох)

Как тебе удобней, так и пиши.

Но не забывай, что придет программер и проклянет твой код)


НиколайКо   (2007-02-02 16:21:00) [15]

Спасибо, я конечно так и думал, что особой разницы нет.
Ну а что вы посоветуете что будет корректнее использовать проверку на nil или Assigned?


Anatoly Podgoretsky   (2007-02-01 19:09:00) [16]

> Ega23  (01.02.2007 19:03:04)  [4]

Тебе смешно, но ведь это на поверхности, если конечно автор привел полную и достоверную информацию. По крайней мере я диагноз ставил на ее основе :-)


Ega23   (2007-02-01 19:03:00) [17]


> Anatoly Podgoretsky ©   (01.02.07 18:59) [3]


:)))))))))


Anatoly Podgoretsky   (2007-02-01 18:59:00) [18]

> НиколайКо  (01.02.2007 17:01:00)  [0]

> Я пока не улавливаю разницу между этими проверками.

Все просто.

Разница в том, что данный программист не знаком с оператором NOT
Там где он не требуется он использует Assigned, а так где нужен использует <> nil, поскольку не знает как написать.


Игорь Шевченко   (2007-02-01 17:05:00) [19]

работает одинаково. а вот ссылки на функции через <> nil не проверишь


Ega23   (2007-02-01 17:05:00) [20]


Assigned function

Tests for a nil (unassigned) pointer or procedural variable.

Unit

System

Category

miscellaneous routines

function Assigned(var P): Boolean;

Description

Use Assigned to determine whether the pointer or procedure referenced by P is nil. P must be a variable reference of a pointer or procedural type. Assigned(P) corresponds to the test P<> nil for a pointer variable, and @P <> nil for a procedural variable.

Assigned returns False if P is nil, True otherwise.

Note: Assigned can't detect a dangling pointer--that is, one that isn't nil but no longer points to valid data. For example, in the code example for Assigned, Assigned won't detect the fact that P isn't valid.


Наверх

Титульная страница Поиск, карта сайта Написать письмо