【发布时间】:2014-03-21 10:38:18
【问题描述】:
考虑这段代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Foo
{
public int x { get; set; }
public String y { get; set; }
public Foo()
{
this.x = 1;
this.y = "Jack";
}
}
class Testing
{
public static void funcChange(Foo bar)
{
bar.x = 2;
bar.y = "Inga";
}
public static void funcNull(Foo bar)
{
bar = null;
}
public static void Main()
{
Foo foo = new Foo();
Foo foo2 = foo;
// let's change foo
Console.WriteLine("foo before:" + foo.x + " " + foo.y); // 1 Jack
funcChange(foo);
Console.WriteLine("foo after:" + foo.x + " " + foo.y); // 2 Inga
// let's null the foo object
Console.WriteLine("foo before:" + foo.x + " " + foo.y); // 2 Inga
funcNull(foo);
Console.WriteLine("foo after:" + foo.x + " " + foo.y); // 2 Inga
}
}
}
当我运行 funcChange 时,foo 从 1 Jack 变为 2 Inga。
当我运行 funcNull 时,即使我将 funcNull 中的 foo 设为 null 之后,foo 也会保持 2 Inga。
据我了解,C# 按值传递对象(我指的不是out 或ref !!!)。
如果是这样,那为什么当我在 foo 上运行 funcChange 时,它的内容正在改变,但是当我运行时
funcNull ,foo 实例仍然指向 2 Inga 吗?
非常感谢
【问题讨论】:
-
投反对票的人:随意投反对票……我不明白原因,但请帮助自己。
标签: c# function object pass-by-value