2017-11-04 17 views
0

元のコードと説明は以下の通りです:C#このキーワード - 私の理解

この参照はインスタンス自体を参照しています。次の例では、 は、方法は相手のチームメイトのフィールドを設定するためにこれを使用しています結婚:

public class Panda 
{ 
    public Panda Mate; 
    public void Marry(Panda partner) 
    { 
     Mate = partner; 
     partner.Mate = this; 
    } 
} 

私は、次のコードを作成しました:

public class Panda 
{ 
    public Panda Mate; 
    public void Marry(Panda partner) 
    { 
     Mate = partner; 
     partner.Mate = this; 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Panda PA1 = new Panda(); 
     Panda PA2 = new Panda(); 
     PA1.Marry(PA2); 
    } 
} 

を、私は次のように私のコードに基づいて図を描きました。

Diagram

だから、私の理解に基づいて、PA1のメイトは現在、ヒープ内のPA2のオブジェクトを指し、およびPA2のさMateは現在、ヒープ内のPA1のオブジェクトを指しています。

この状況でこのキーワードを正しく理解していますか?ご協力ありがとうございました。

+4

はい、あなたは正しいです。あなたはこの質問を閉じることができます –

+0

あなたの理解にはあまり重要ではありませんが、あなたの図は一般的な誤解を示唆しています。Marryメソッドのコードは、クラスの2つ(または3つまたはn)インスタンス間では複製されませんが、両方のインスタンスには、Marryメソッドのコードが存在するメモリの領域を指す隠しフィールド(メソッドテーブル)があります。 Pandaクラスのインスタンスで使用されます。 – Steve

+0

こんにちは@Steve、ありがとうございます。私はC#の初心者ですので、コード自体について多くの誤解があります。可能であれば、わたしの理解を助けるための答えを説明するための簡単な図を描くようお願いしますか? – user8778584

答えて

1

はい、アンダースタンディングが明確です。 このは、現在のクラスオブジェクトのインスタンスを保持します。

0

は、あなたが持っているこのコードは(読みやすくなりますので、私が命名を変更)を参照してください:

Panda george = new Panda(); 
Panda elaine = new Panda(); 
george.Marry(elaine); 

あなたがMarryメソッドを呼び出すと、引数としてelaineを渡しています。しかしここには明白でない部分があります:elaineの前に別の引数が渡され、その引数がgeorgeです。はいgeorgeMarryがインスタンスメソッドであり、呼び出すインスタンスがgeorgeであるため、が暗黙的にに渡されます。この暗黙的に渡された引数は、Marryメソッドのスタックにプッシュされ、thisという名前です。このようになります方法Marry内したがって、:

public void Marry(Panda partner) 
{ 
    Mate = partner; 
    partner.Mate = this; 
} 

あなたが渡された明示的な引数がpartnerあるので、それはelaineになりますが、暗黙のうちに渡された引数がgeorgeです。したがって、Marryの方法内のは、georgeを意味し、参照します。従ってこのコード行:

partner.Mate = this; 

elaine.Mate =ジョージを意味します。

結論として、暗黙の引数は常にインスタンスメソッドに渡され、引数はインスタンスメソッドが呼び出されるオブジェクトです。その引数はthisパラメータになります。

トピックはありませんが、密接に関連しています。これは、より少なく、Extension Methodsのインスタンスメソッドのように扱うことができます。拡張メソッドの最初のパラメータは、常にthisです。

+0

@ user8778584私は助けることができてうれしいです。 [this](https://stackoverflow.com/help/someone-answers)をお読みください。 – CodingYoshi

関連する問題