分配vs <> nil

Ken*_*nge 27 delphi null pointers

有什么区别If Assigned(Foo)If (Foo <> nil)?如果是这样,他们何时应该使用?

And*_*and 39

这几乎是一回事.官方文件说明

Assigned(P)对应于指针变量的测试P <> nil,对于程序变量对应于@P <> nil.

所以,如果Assigned(P)是一个普通的指针,则P <> nil@P <> nil正好相等.另一方面,如果PInteger是某些程序,那么

var
  i: Integer;
  p: PInteger;
begin
  i := 5;

  p := @i;
  // Assigned(p)        True
  // p <> nil           True

  p := nil;
  // Assigned(p)        False
  // p <> nil           False
Run Code Online (Sandbox Code Playgroud)

将会有效

L := TList<integer>.Create;
try
  // Assigned(L)        True
  // L <> nil           True
finally
  FreeAndNil(L);
end;

// Assigned(L)          False
// L <> nil             False
Run Code Online (Sandbox Code Playgroud)

var
  FC: TFormClass;
begin

  FC := TForm;
  // Assigned(FC)       True
  // FC <> nil          True

  FC := nil;
  // Assigned(FC)       False
  // FC <> nil          False
Run Code Online (Sandbox Code Playgroud)

甚至不会编译.因此,结论是,PMyRecTBitmap每一次完全等同两部作品!

  • @ az01:如果MyVar没有MyType`的实例,则因为异常而失败。MyType(MyVar).Prop没有。 (2认同)