如下所示class Program
{
static void Main(string[] args)
{
Person p = new Person();
p.Name = "Jack";
Change(p);
Console.Write(p.ToString());
}
static void Change(Person p)
{
Person c = new Person();
c.Name = "Mary";
p = c;
}
} class Person
{
private string name; public string Name
{
get { return name; }
set { name = value; }
}
public override string ToString()
{
return this.name;
}
}
最后的输出竟然是jack,明明是个传引用,为什么结果会是如此呢,实在有点搞不明白我后来测试了一下,问题好像是出在静态函数的关系,同样的调用 Person p = new Person();
p.Name = "Jack";
Change(p);
Console.Write(p.ToString());
这几句话,如果放在实例函数里面,结果就会是mary。但是我很想知道原理,望高手赐教(分数没了,实在不好意思)
{
static void Main(string[] args)
{
Person p = new Person();
p.Name = "Jack";
Change(p);
Console.Write(p.ToString());
}
static void Change(Person p)
{
Person c = new Person();
c.Name = "Mary";
p = c;
}
} class Person
{
private string name; public string Name
{
get { return name; }
set { name = value; }
}
public override string ToString()
{
return this.name;
}
}
最后的输出竟然是jack,明明是个传引用,为什么结果会是如此呢,实在有点搞不明白我后来测试了一下,问题好像是出在静态函数的关系,同样的调用 Person p = new Person();
p.Name = "Jack";
Change(p);
Console.Write(p.ToString());
这几句话,如果放在实例函数里面,结果就会是mary。但是我很想知道原理,望高手赐教(分数没了,实在不好意思)
{
Person c = new Person();
c.Name = "Mary";
p = c;
}
按值傳遞
但是我不知道为什么
在传值的时候,如果没有ref关键字,那么传值都是按值传递,也就是作了一个副本在方法中使用
但虽然是按值传递,作为引用类型,如果被传入的时候,通常副本都是创建的"浅表副本",即引用不同,但实际字段的引用相同.因此在方法中修改字段的值通常会将该对象的状态修改.
不过就算是传入引用类型,如果是按值传递,在方法中通过arg = value这种方式改变值的方式,也不会改变方法外,被传入的参数.
原理就是:方法外的对象引用与方法内的对象引用是两个不同的引用对象,虽然它们都指向同一个地址.
当简单赋值的时候,实际上是方法内的引用被指向了新地址,而方法外的引用却没有改变,因此离开方法之后,方法外部的引用仍然指向了原有地址
当然,如果是用ref或out进行按引用传值,那么简单赋值就会更改方法外部的引用的实际指向.
--------------
lz你看过书吗?或者你看的什么书啊?