2011-07-22 6 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あなたが現在を指定したいときに使用しますオブジェクトを別のメソッドまたはオブジェクトに変換します。例えば

:この上記のコードはTMyClassインスタンスを指しList.Objects []と、TStringsリストに項目を追加する

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; 

。そして、それがこれがリストのすべての項目の場合に当てはまることを確認します。

+0

@AB - 「暗黙の自己」 - 内部クラスメンバーを参照するときに「自己」を必要とするPythonを使い始めたときから、私はDelphiでもこれをやり始めました。コードをすばやくスキャンすることができます。 – Vector

+0

@Mikey Delphiの一般的なプラクティスは、 'self.'接頭辞を使用しないことです。実際、IDEインテリセンスを使用すると、プロパティ名に素早くアクセスしたり、マウスのポップアップヒントやCtrl +クリックで宣言を見ることができるため、この接頭辞を指定する必要はありません。コードにグローバル変数を定義していない場合(これは良いコードに必要です)、メソッドコード内の識別子がプロパティ/メソッド名であることがわかります。したがって、( 'with'ステートメント内でない限り)あなたのメソッドに' self.'接頭辞を使用しないでください。 –

+0

@AB - あなたが言ったすべてを知っていますが、それはそれを使う理由を否定しません。コードをスキャンしてスピードを上げたい場合は、「自己」が役立ちます。座ったり、マウスやインタラクションを一切行わずにコードを読んだりするのが好きで、コードを印刷して読むだけです。 LOL – Vector

9

デルファイでは、Selfはこれに相当します。また、hereに記載されているように割り当て可能です。

+3

値に渡されるため、Selfに割り当てることはあまり役に立ちませんが、それは可能です。コンストラクタから何も返されない(実際にはコンストラクタは何も返さない - 代入構文は単なる利便性に過ぎない)。 –

+1

ええと...私はあなたが連れているSOの質問の人々が同じことを言うのを見ます。 –

+0

自己への割り当てはコーナーケースであり、通常、悪い習慣とみなされる可能性があるため、これを行う必要はありません。しかし、クラスへの参照としてSelfを使用することは、非標準の命名規則を使用している場合にのみ有効です。標準的な規則は、Fをクラス変数の接頭辞(例としてFIsCorrect)として使用し、Aを手続き/関数の引数(AIsCorrect)として使用することです。次に、クラス変数の割り当ては、FIsCorrect = = AIsCorrectと同じくらい簡単です。代わりに、関数(プロシージャ)引数がIsCorrect:Booleanの場合は、Self.IsCorrect:= IsCorrectを使用する必要があります。 – too

関連する問題