如果myVar is TMyObj
为 nil ,指令myVar
是否可以工作?我不知道内部如何执行
答案 0 :(得分:10)
如果myVar
的类型为TMyObj
或其后代,它将起作用,但是如果对象为nil,则返回false。
请参见The is Operator :(强调我的意思)
执行动态类型检查的is运算符用于验证对象的实际运行时类。表达式:
object is class
如果object是由class或其后代之一表示的类的实例,则返回True,否则返回False。 (如果object为nil,则结果为False。。)如果声明的object类型与class不相关,即,如果类型不同且一个不是另一个的祖先,产生编译错误。
答案 1 :(得分:1)
is
的实现在系统单元中可用。
function _IsClass(const Child: TObject; Parent: TClass): Boolean;
begin
Result := (Child <> nil) and Child.InheritsFrom(Parent);
end;
尽管如此,它并不是100%可靠的,因为is
运算符周围存在一些编译器魔术。
除其他外,
var
vWin : TWinControl;
begin
vWin := TWinControl(TControl.Create(nil));
if vWin is TWinControl then
ShowMessage('The shouldn''t be true!!!');
vWin.Free;
end;
针对(至少在西雅图)进行了优化
var
vWin : TWinControl;
begin
vWin := TWinControl(TControl.Create(nil));
if vWin <> nil then
ShowMessage('The shouldn''t be true!!!');
vWin.Free;
end;
没有给出预期的结果。
注意:这里我不假装vWin := TWinControl(TControl.Create(nil))
是有效的操作。