1

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

を呼び出した後、なぜprogram.personここでnullになるのChangePersonですか?

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; }
    }
}
4

2 に答える 2

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、パラメータにキーワードを追加します。

于 2012-04-27T11:09:05.243 に答える
3

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

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

次の違いを理解することは非常に重要です。

  • 変数
  • 参照(変数のなど)
  • オブジェクト(参照値が参照する

詳細については、C#でのパラメーターの受け渡しに関する私の記事をお読みください。

于 2012-04-27T11:03:45.977 に答える