![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.