![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Бывают ли объекты с self=nil?
Bless © (2005-07-04 16:07:00)Посмотрел в модуле system реализацию метода TObject.Free:
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
Что, разве могут быть случаи, когда Self=nil?
Kerk (2005-07-05 12:26:00) [1]Anatoly Podgoretsky © (05.07.05 12:23) [28]
поскольку Self всего лишь неявный параметр метода и не может быть применено к объекту.
о! :)
Anatoly Podgoretsky (2005-07-05 12:23:00) [2]Чего спорить то, вопрос четко поставлен " Бывают ли объекты с self=nil?", таких не бывает даже с другими вариантами, поскольку Self всего лишь неявный параметр метода и не может быть применено к объекту. Даже если смотреть с точки зрения параметров, но таких объектов в природе не существует.
Остальное только от желания потрепаться.
Kerk (2005-07-05 12:08:00) [3]Игорь Шевченко © (05.07.05 12:05) [26]
Подмена понятий.
Игорь Шевченко (2005-07-05 12:05:00) [4]Kerk © (05.07.05 11:53) [24]
> TObject.Self ?
TObject
isasa (2005-07-05 12:03:00) [5]Цитата из help
Methods use the same calling conventions as ordinary procedures and functions,
except that every method has an additional implicit parameter Self,
which is a reference to the instance or class in which the method is called.
The Self parameter is passed as a 32-bit pointer.
Under the register convention, Self behaves as if it were declared before all other parameters.
It is therefore always passed in the EAX register.
Under the pascal convention,
Self behaves as if it were declared after all other parameters
(including the additional var parameter sometimes passed for a function result).
It is therefore pushed last, ending up at a lower address than all other parameters.
Under the cdecl, stdcall, and safecall conventions,
Self behaves as if it were declared before all other parameters, but after the additional
var parameter (if any) passed for a function result.
It is therefore the last to be pushed, except for the additional var parameter.
Kerk (2005-07-05 11:53:00) [6]Игорь Шевченко © (05.07.05 11:48) [23]
TObject.Self ?
Игорь Шевченко (2005-07-05 11:48:00) [7]
> Нету у объектов никаких Self. Self есть у методов, как
> один из параметров. И он может быть nil.
Так так-таки, стало быть, и нету ? (с)
Kerk (2005-07-05 11:44:00) [8]Игорь Шевченко © (05.07.05 11:40) [20]
> А объект тут причем?
при сабже, дружище, при сабже.
В сабже сама постановка вопроса имхо некорректна. Нету у объектов никаких Self. Self есть у методов, как один из параметров. И он может быть nil.
Anatoly Podgoretsky (2005-07-05 11:43:00) [9]Но объекта то все равно не будет.
Игорь Шевченко (2005-07-05 11:40:00) [10]Kerk © (05.07.05 11:37) [19]
> А объект тут причем?
при сабже, дружище, при сабже.
> > Что, разве могут быть случаи, когда Self=nil?
>
> Да. Могут.
Могут. При некорректном коде, например.
Kerk (2005-07-05 11:37:00) [11]Игорь Шевченко © (05.07.05 11:08) [18]
Где объект, у которого Self равен nil ?
А объект тут причем?
> Что, разве могут быть случаи, когда Self=nil?
Да. Могут.
Игорь Шевченко (2005-07-05 11:08:00) [12]Kerk © (04.07.05 21:59) [15]
Что ты этим хочешь сказать ? Где объект, у которого Self равен nil ?
Anatoly Podgoretsky (2005-07-05 08:38:00) [13]evvcom © (05.07.05 08:26) [16]
из-за того что существует такое: FreeAndNil
Наоборот, эту нетипизираную функцию сделали после для любителей повторного использования объектоа, спекулируя на способности Free проверять на nil.
evvcom (2005-07-05 08:26:00) [14]Как уже было сказано мастерами объектовс Self = nil не бывает. Если Self = nil, то очевидно объекта уже (или еще) нет. Во всяком случае указателя на объект точно нет. А все эти извращения вокруг TObject(nil).SomeMethod это именно извращения. В методе Free сделали такую проверку, наверное, из-за того что существует такое: FreeAndNil. Хотя, кто их знает, кому это вообще пригодилось? У меня есть четкое правило, кто вызывает конструктор, тот вызывает и деструктор. Ну, за малыми исключениями. И никаких повторных вызовов Free.
Kerk (2005-07-04 21:59:00) [15]
rocedure TForm1.FormCreate(Sender: TObject);
var
MyProc: procedure of object;
begin
TMethod(MyProc).Code := @TForm1.Test;
TMethod(MyProc).Data := nil;
MyProc;
end;
procedure TForm1.Test;
begin
if Self = nil then MessageBox(0,0,0,0);
end;
Гаврила (2005-07-04 19:46:00) [16]Не получится потому ,что эта ссылка передается по значению (см. [5]).
то есть присвоить то можно, только эффекта от этого за границами метода не будет
Игорь Шевченко (2005-07-04 18:16:00) [17]ANB © (04.07.05 17:59) [11]
> Хм. А Self можно в методе присвоить nil, тогда получится
> . . .
Не получится.
Digitman (2005-07-04 18:03:00) [18]
> А Selfможно в методе присвоить nil, тогда получится
если долго дрючиться, то что-нибудь обязательно получится.
ANB (2005-07-04 17:59:00) [19]
> Игорь Шевченко © (04.07.05 17:42) [10]
Хм. А Self можно в методе присвоить nil, тогда получится . . .
Игорь Шевченко (2005-07-04 17:42:00) [20]
> Бывают ли объекты с self=nil?
Не бывают.