【发布时间】: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