2011-07-22 62 views

回答

3

在大多數情況下,您不應該在方法中使用self

事實上,這就像如果有一個隱含的self.前綴,當你訪問類的屬性和方法,一類方法中:

type 
    TMyClass = class 
    public 
    Value: string; 
    procedure MyMethod; 
    procedure AddToList(List: TStrings); 
    end; 


procedure TMyClass.MyMethod; 
begin 
    Value := 'abc'; 
    assert(self.Value='abc'); // same as assert(Value=10) 
end; 

self是用來當你想指定當前反對另一種方法或對象。

例如:

procedure TMyClass.AddToList(List: TStrings); 
var i: integer; 
begin 
    List.AddObject(Value,self); 
    // check that the List[] only was populated via this method and this object 
    for i := 0 to List.Count-1 do 
    begin 
    assert(List[i]=Value); 
    assert(List.Objects[i]=self); 
    end; 
end; 

這上面的代碼將項目添加到TStrings列表,List.Objects []指向TMyClass實例。而且它會檢查列表中所有項目的情況。

+0

@AB - 「隱式自我」 - 自從我開始搞亂Python,在引用任何內部類成員時需要'self',我也開始在Delphi中做這件事 - 不確定我是否喜歡它,但不是風格上,但它似乎有助於更快地掃描代碼。 – Vector

+0

@Mikey Delphi中的常用做法不是使用'self.'前綴。事實上,IDE intellisense允許您快速訪問屬性名稱,或者使用鼠標彈出提示或Ctrl + Click查看聲明 - 因此不需要指定此前綴。如果您沒有在您的代碼中定義全局變量(這是良好代碼所必需的),那麼您知道方法代碼中的標識符是屬性/方法名稱。因此,你不應該在你的方法中使用'self.'前綴(除非在'with'語句中)。 –

+0

@AB - 我知道並同意你所說的一切,但這並不否定我使用它的理由。如果你想掃描/加速讀取一段代碼,'self'會有幫助 - 通常我喜歡坐下來閱讀代碼,而不用任何鼠標或交互,我還想打印出代碼並閱讀它。所以這是「自助」的方法....大聲笑 – Vector

9

在delphi中自我就等於這個。它也可以按照here中的描述分配。

+3

請注意,由於它是按值傳遞的,賦值給Self並不是非常有用,儘管它可以完成。它不會像一些人想象的那樣從構造函數中「返回」零(構造函數實際上不會「返回」任何東西 - 賦值語法只是一種方便)。 –

+1

嗯......我看到你跟這個問題中的人們說的一樣。 –

+0

分配給自己是一個特例,通常你不需要這樣做,因爲它可能被認爲是一種不好的做法。然而,只有在使用非標準命名約定的情況下,使用Self作爲對類的引用纔是有用的。標準約定是使用F作爲類變量的前綴(FIsCorrect作爲示例)和A作爲過程/函數參數(AIsCorrect)。然後,類變量的賦值就像FIsCorrect:= AIsCorrect一樣簡單,或者如果function(procedure)參數爲:IsCorrect:Boolean,則需要使用Self.IsCorrect:= IsCorrect。 – too