2017-06-14 25 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這是一個未經檢查的演員。你告訴編譯器,你比它知道的更好,並且它必須抑制任何類型的不匹配錯誤。作爲一般規則,除非絕對必要,最好避免未經檢查的轉換。 –

相關問題