2010-11-18 4 views
2

誰でも以下のコードの動作を説明することはできますか。下のコードの出力は文字列 "str"で、iの値は100です。オブジェクトの動作

なぜそうですか?オブジェクトc1 = nullを設定した後、nullでないのはなぜですか?

public class Class1 
{ 
    public int i; 
    public Class1() 
    { 
     i = 10; 
    }  

    public string method1() 
    { 
     return "str"; 
    } 
} 

public class Class2 
{ 
    public void method2(Class1 c1) 
    { 
     c1.i = 100; 
     c1 = null; 
    } 
} 

    void main() 
    { 
     Class1 c1 = new Class1(); 
     Class2 c2 = new Class2(); 
     c2.method2(c1); 
     Response.Write(c1.method1()); 
     Response.Write(c1.i.ToString()); 
    } 

答えて

3

これは、参照渡し/値渡しのものです。 Javaranch Camp site stories: Pass By Value Pleaseはとてもうまく説明しています。私は上記のリンクはJavaのためのもので、これはC#の質問ですが、同じことが起こります( "ref"キーワードが使われていない限り)。

+0

ここにはC#固有の優れた記事があります。http://www.yoda.arachsys.com/csharp/parameters.html – LukeH

+0

@LukeHあなたの記事は少しワッフル/アカデミックです。私はもっ​​とJava版が好きです。 –

5

method2(Class1 c1)に電話すると、オブジェクト自体ではなくオブジェクトへの参照ではなく、オブジェクトへの参照のコピーが渡されます。 c1 = nullを設定すると、オブジェクトではなく参照のコピーをnullに設定します。あなたはこれまで、あなたのメソッドのシグネチャを変更することで、期待する動作を得ることができます

:C#ので

method2(ref Class1 c1)

4

を、参照は値によって渡されます。つまり、method2は、c1への参照値のコピーを受け取ります。

method2の設定c1 = nullは参照のローカルコピーにのみ影響します。

うまくいけば、あなたのコードの簡単な編集がなぜお見せすることができますthis article for more info

1

を参照してください:

public class Class1 
{ 
    public int i; 
    public Class1() 
    { 
     i = 10; 
    }  

    public string method1() 
    { 
     return "str"; 
    } 
} 

public class Class2 
{ 
    public void method2(Class1 myLocalReference) 
    { 
     myLocalReference.i = 100; 
     myLocalReference = null; 
    } 
} 

void main() 
{ 
    Class1 c1 = new Class1(); 
    Class2 c2 = new Class2(); 
    c2.method2(c1); 
    Response.Write(c1.method1()); 
    Response.Write(c1.i.ToString()); 
} 

私はClass2.method2に使用する基準が使用されているものと同じではないことを明確に示していると思います主にc1がmainで宣言されている場合、メソッド呼び出しc2.method2(c1);のパラメータとして使用すると、Class1インスタンスへの参照がmyLocalReferenceという新しいローカル値にコピーされます。 myLocalReference = null;を設定し、method2内でResponse.Write(myLocalReference.method1());またはResponse.Write(myLocalReference.i.ToString());が適切に失敗することがわかります。 method2がローカル参照を終了すると、myLocalReferenceが有効範囲外になり、後続のResponse.Writeメソッドが成功するようにc1参照が存在し、変更されていないmainに戻ります。

関連する問題