【问题标题】:Why reference type is not assigned a value when I pass it as parameter?为什么当我将引用类型作为参数传递时,它没有赋值?
【发布时间】:2012-04-27 11:01:45
【问题描述】:

这里,Person 是一个类,因此是一个引用类型,当我将它作为参数传递给另一个函数并在那里赋值时,它应该被更改。

为什么program.person 在调用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; }
    }
}

【问题讨论】:

  • 你在哪里设置 program.person 之前通过它?你需要写 program.person = new Person() { Name = "b", Age = 2 };在调用 changeperson() 和 morevoer 之前,我不确定你想得到什么作为输出

标签: .net c#-4.0 reference


【解决方案1】:

作为对@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关键字添加到你的参数中。

【讨论】:

    【解决方案2】:

    为什么调用 ChangePerson 后 program.person 在这里为空?

    参数(它是一个引用)是按值传递的。当您更改 parameter 的值以引用不同的对象时,根本不会更改参数。请注意,在这种情况下,您甚至没有传递变量的值 - 您传递的是评估(命名错误的)属性的结果。

    了解以下之间的区别非常重要:

    • 一个变量
    • 引用(例如变量的
    • 一个对象(引用值引用

    请阅读我的article on parameter passing on C# 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多