2017-06-14 22 views
2

如何在下面的情况下测试一个非零TObject不包含特定类的对象?什么时候在delphi中使用is运算符是正确的?

procedure TForm7.testme; 
var 
    mystring: string; 
    obj: TObject; 
begin 
    mystring := 'asd'; 
    obj := TObject(mystring); 

    if assigned(obj) then 
     if obj is TestClass then // --> this is failing 
     // ... 
end; 
+4

您可能来自另一种语言,其中字符串是对象。在Delphi中,一个字符串是**不是一个对象,所以你不应该将它转换为一个。 –

+1

哦,'is'不是一个“命令”,它是一个操作符。 –

回答

9
obj := TObject(mystring); 

这是错误的。一个TObject可以容纳一个有效的对象,或nil。任何事情都会导致未定义的行为。这意味着is或其他任何事情都不能期望以任何有意义的方式行事。

在对象引用上运行的任何方法的实现都隐含地依赖于实际上是对象的引用。对于像is之类的东西,实现将查找实例的类,这取决于将内存作为对象进行布局。字符串不适合账单。

运算符is可以告诉您有关对象类型的信息。除了特殊值nil之外,传递不是对象的东西是非法的。

解决方法是停止将无效数据放入对象引用。

+0

只是好奇,如果类型铸造一个字符串TObject是一个错误,为什么编译器不会选择这个?这是Embarcadero的错误吗? – Fero

+2

@Fero这是一个未经检查的演员。你告诉编译器,你比它知道的更好,并且它必须抑制任何类型的不匹配错误。作为一般规则,除非绝对必要,最好避免未经检查的转换。 –

相关问题