2011-07-22 35 views

Trả lời

3

Trong hầu hết các trường hợp, bạn không nên sử dụng self trong các phương pháp.

Trong thực tế, nó giống như nếu có một tiềm ẩn self. prefix khi bạn truy cập các thuộc tính lớp và phương pháp, trong vòng một phương pháp học:

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; 

Các self được sử dụng khi bạn muốn xác định hiện tại đối tượng với một phương thức hoặc đối tượng khác.

Ví dụ:

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; 

mã trên này sẽ thêm một mục vào danh sách TStrings, với List.Objects [] trỏ đến các trường hợp TMyClass. Và nó sẽ kiểm tra này đã được các trường hợp cho tất cả các mục của Danh sách.

+0

@AB - "tự ẩn" - kể từ khi tôi bắt đầu rối tung với Python, yêu cầu 'tự' khi tham chiếu bất kỳ thành viên lớp nội bộ nào, tôi cũng bắt đầu làm điều đó ở Delphi - không chắc tôi có thích hay không theo phong cách, nhưng nó dường như tạo điều kiện cho việc quét mã nhanh hơn. – Vector

+0

@Mikey Việc thực hành phổ biến ở Delphi là không sử dụng tiền tố 'self.'. Trong thực tế, IDE intellisense cho phép bạn truy cập nhanh vào các tên thuộc tính, hoặc xem khai báo với gợi ý pop-up của chuột hoặc Ctrl + Click - vì vậy không cần phải xác định tiền tố này.Nếu bạn không định nghĩa các biến toàn cầu trong mã của bạn (điều này là bắt buộc đối với mã tốt), bạn biết rằng các mã định danh trong mã phương thức của bạn là các tên thuộc tính/phương thức. Vì vậy, bạn không nên sử dụng tiền tố 'self.' trong các phương thức của bạn (trừ khi bên trong một câu lệnh' with'). –

+0

@AB - Tôi biết và đồng ý với tất cả những gì bạn nói nhưng điều đó không phủ nhận lý do tôi sử dụng nó. Nếu bạn muốn quét/tốc độ đọc một đoạn mã, 'tự' giúp - thường tôi thích ngồi lại và chỉ đọc mã mà không có bất kỳ con chuột hoặc tương tác nào cả, và tôi cũng vẫn muốn in mã và chỉ đọc nó. Vì vậy, đó là cách tiếp cận "tự giúp đỡ" ..... LOL – Vector

9

Trong delphi Self là tương đương với điều này. Nó cũng có thể gán như được mô tả trong here.

+3

Lưu ý rằng, vì nó được thông qua bởi giá trị, gán cho tự không phải là rất hữu ích, mặc dù nó có thể được thực hiện. Nó sẽ không, như một số có thể mong đợi, "trả về" nil từ một constructor (các nhà xây dựng thực sự không "trả về" bất cứ điều gì - cú pháp gán chỉ là một tiện lợi). –

+1

Hmmm ... Tôi thấy rằng những người trong câu hỏi SO được liên kết bởi bạn nói như vậy. –

+0

Chỉ định cho bản thân là trường hợp góc và thông thường bạn sẽ không cần thực hiện điều này vì nó có thể được coi là hành vi không tốt. Tuy nhiên, việc sử dụng Self như một tham chiếu đến một lớp chỉ hữu ích nếu một người đang sử dụng các quy ước đặt tên không chuẩn. Các quy ước tiêu chuẩn sẽ là việc sử dụng F làm tiền tố của các biến lớp (FIsCorrect làm ví dụ) và A làm các đối số thủ tục/hàm (AIsCorrect). Sau đó, gán các biến lớp sẽ đơn giản như FIsCorrect: = AIsCorrect, bạn sẽ cần sử dụng hàm Self.IsCorrect: = IsCorrect nếu tham số hàm (thủ tục) là: IsCorrect: Boolean. – too