2012-04-27 2 views
1

ここで、Personはクラスであるため、参照型で、別の関数でパラメータとして渡してそこに代入するときに変更する必要があります。パラメータとして渡すときに参照型に値が割り当てられないのはなぜですか?

ChangePersonに電話をした後にprogram.personがヌルになるのはなぜですか?

namespace IndirectlyPropertySet 
{ 
    class Program 
    { 
     public Person _person; 

     public Person person 
     { 
      get { return _person; } 
      set 
      { 
       if (_person != value) 
       { 
        _person = value; 
       } 
      } 
     } 

     static void Main(string[] args) 
     { 
      Program program = new Program(); 

      ChangePerson(program.person); 
      // Why program.person is null after executing this ? 

      program.person = new Person() { Name = "b", Age = 2 }; 
     } 

     static void ChangePerson(Person p) 
     { 
      Person pe = new Person() { Name = "a", Age = 1 }; 
      p = pe; 
     } 
    } 

    public class Person 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 
} 
+0

program.personはどこに渡しますか? program.person = new Person(){Name = "b"、Age = 2}と書く必要があります。 changeperson()とmorevoerを呼び出す前に、出力として取得しようとしていることがわかりません – Milee

答えて

4

@ JonSkeetの答えに加えて、代わりにこれを行うコードを書き直すと、うまくいきます。

static void ChangePerson(ref Person p) 
{ 
    Person pe = new Person() { Name = "a", Age = 1 }; 
    p = pe; 
} 

void Main() 
{ 
    Person p = program.person; 
    ChangePerson(ref p); 
    // program.person will now be set to "a" with age 1 at this point 
    program.person = p; 

    program.person = new Person() { Name = "b", Age = 2 }; 
} 

キーポイント、すなわち、あなたのパラメータにrefキーワードを追加参照によって参照型を通過させることです。

3

program.personがChangePersonを呼び出した後、ここでnullであるのはなぜ?

引数(参照)が値渡しされています。 パラメータの値を別のオブジェクトを参照するように変更すると、引数がまったく変更されません。この場合、変数の値を渡すことさえしていないことに注意してください。(悪名の付いた)プロパティを評価した結果を渡しています。

それとの差を理解することは非常に重要です:

  • 可変
  • 基準(例えば、変数の値)基準値指す
  • オブジェクト( )

詳細については、私のarticle on parameter passing on C#をお読みください。

関連する問題