【问题标题】:Passing object from Main() to function changes the object , even though C# is by value?将对象从 Main() 传递给函数会更改对象,即使 C# 是按值的?
【发布时间】:2014-06-05 13:16:43
【问题描述】:

考虑以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test
{
    class Person
    {
        public Person(String name)
        {
            this.first = name;
        }


        private String first;
        public void setName(String name)
        {
            this.first = name;
        }

        public String getName()
        {
            return this.first;
        }
    }
    class Program
    {
        public static void changeName(Person per)
        {
            per.setName("Jack");
        }

        public static void changeToNull(Person per)
        {
            per = null;          
        }

        static void Main(string[] args)
        {
            Person p = new Person("David");
            Console.WriteLine(p.getName());
            changeName(p);
            Console.WriteLine(p.getName());
            changeToNull(p);
            Console.WriteLine(p.getName());
        }
    }
}

输出是:

David
Jack
Jack

据我了解,C# 是按值计算的,那么为什么在将 p 传递给 changeName() 时,它也会更改 Main() 中的 p,但是当我将其设置为 null 时,它会保持 Jack !?

【问题讨论】:

  • reference 是按值传递的。 p 本身的值没有改变 - 它仍然是对与以前相同的对象的引用。但是,对象本身的状态发生了变化。见pobox.com/~skeet/csharp/parameters.html
  • 参数是值,是的,但参数本身就是一个引用。

标签: c# pass-by-reference pass-by-value


【解决方案1】:

Person 是一种引用类型,因此当您将它作为值传递给 changeName 时,您真正传递的是指向内存中该 Person 对象的指针(地址)。由于该指针是按值传递的,因此您无法将其重新分配给 Person 的不同副本,但您可以调用该对象上可能会更改其内部状态的方法。 changeToNull 方法的行为方式与它的行为方式相同,因为指向 Person per 的指针再次按值传递。当您将 per 设置为 null 时,您只会更改 changeToNull 方法的本地指针。

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多