Следующая программа Delphi вызывает метод по ссылке nil и работает нормально.Поддерживается ли это метод вызова по ссылке nil в Delphi?
program Project1;
{$APPTYPE CONSOLE}
type
TX = class
function Str: string;
end;
function TX.Str: string;
begin
if Self = nil then begin
Result := 'nil'
end else begin
Result := 'not nil'
end;
end;
begin
Writeln(TX(nil).Str);
Readln;
end.
Однако в структурно-подобной C# программы, System.NullReferenceException
будет поднят, который, кажется, что нужно делать.
namespace ConsoleApplication1
{
class TX
{
public string Str()
{
if (this == null) { return "null"; }
return "not null";
}
}
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine(((TX)null).Str());
System.Console.ReadLine();
}
}
}
Поскольку TObject.Free использует такой стиль, это, кажется, «поддерживается» для вызова метода на нулевой ссылке в Delphi. Это правда ? (Предположим, что в if Self = nil
ветви, ни одного поля экземпляра не будет доступен.)
Связанные, http://stackoverflow.com/questions/1040860/why-would-you-check-for-assignedself-in-object-methods –
@HenkHolterman Большое спасибо за ценную информацию! – SOUser