class Program
{
static void Main(string[] args)
{
Person p = new Person("ddd", 10);
p.Display();//输出ddd,10
Send(p);
p.Display();//输出xxx,99
string a = "111111";
Console.WriteLine(a);//输出111111
Send(a);
Console.WriteLine(a);//输出111111,为什么不是22222
Console.ReadKey();
} static void Send(string s)
{
s = "222222";
}
//复制的是对象的引用,同一对象
static void Send(Person p)
{
p.Age = 99;
p.Name = "xxx";
} }
class Person
{
public int Age { get; set; }
public string Name { get; set; }
public Person(string n, int a)
{
Age = a;
Name = n;
}
public void Display()
{
Console.WriteLine("Name:{0},Age:{1}",Name,Age);
}
}求输出解决的原因?
{
static void Main(string[] args)
{
Person p = new Person("ddd", 10);
p.Display();//输出ddd,10
Send(p);
p.Display();//输出xxx,99
string a = "111111";
Console.WriteLine(a);//输出111111
Send(a);
Console.WriteLine(a);//输出111111,为什么不是22222
Console.ReadKey();
} static void Send(string s)
{
s = "222222";
}
//复制的是对象的引用,同一对象
static void Send(Person p)
{
p.Age = 99;
p.Name = "xxx";
} }
class Person
{
public int Age { get; set; }
public string Name { get; set; }
public Person(string n, int a)
{
Age = a;
Name = n;
}
public void Display()
{
Console.WriteLine("Name:{0},Age:{1}",Name,Age);
}
}求输出解决的原因?
{
s = "222222";
}=> static void Send(ref string s)
{
s = "222222";
}
=>
Send(ref a);
string b = a;Console.WriteLine(object.ReferenceEquals(a, b));//true——说明引用相同a = "aaa";Console.WriteLine(object.ReferenceEquals(a, b));//false——说明引用不同想想为什么在改变a的值前后,为什么改变了a的引用
{
s = "222222";
}这里面的a是一个新的对象,和外面的变量a是两码事,当然改变s的值不会影响外面的a的值啦!!
static void Send(Person p)
{
p.Age = 99;
p.Name = "xxx";
}
改为
static void Send(Person p)
{
p = new Person("xxx", 99); p.Age = 99;
p.Name = "xxx";
}那么,打印出来的值还是不会变的试试吧!!
http://www.cnblogs.com/DonLiang/archive/2008/02/16/1070717.htmlstring a = "111111";
Console.WriteLine(a);//输出111111
Send(a);
Console.WriteLine(a);//输出111111,为什么不是22222static void Send(string s)
{
s = "222222";
}
你的上述代码里,把Send(string)函数内部的s="222222"理解成s = new string ("22222"), 再比照上面链接里的情形,你就清楚了。
如果有空上网查下形参ref和out的使用,以上问题自然就能解决了,
哎,用手机打这么几个字都累
{
s = "222222";
}=> static void Send(ref string s)
{
s = "222222";
}
如果想按引用传递的话可以通过ref
PS:所谓讲解其实也是建立在说服上面,没有真理,定理让你来推论
至于微软为什么这样做,你可以去问他们clr小组!
还不明白??
我12喽回答的你看了没??在这个方法里面
static void Send(string s)
{
s = "222222";
}
p是一个局部变量,当为它赋值的时候,就是重新构造对象了,22L和23L的朋友说明了这个问题。。那么你再看一下我12L的回复和下面的对比一下就明白了
static void Send(Person p)
{
p = new Person("xxx", 99);//主要是这儿,重新构造对象。在另一个Send方法里面,为string str赋值和这儿是一样的意思。 p.Age = 99;
p.Name = "xxx";
}
首先,声明的值为“11111”的a和方法Send中形参a,不是同一个a,Send中也可以叫做b;
第二,传引用的意思是,把内存地址的引用传给了形参;传地址的意思是,把内存中的值传给了形参,(但是开辟了一个新的内存保存了这个值);所以方法中,传引用修改的是原内存中的值,传值只是修改了新内存中的值;
第三,方法体结束以后,方法外的那个a,引用的还是原内存的地址,输出的也是原内存的值;而方法内的那个既可以是a也可以是b的那个形参,改变了不会对a有任何影响。注意:如果是传引用,方法内就是对于原内存的值进行了修改,就像Send(Person p)那样。
这其实是值类型与引用类型赋值上的区别,string实际上是引用类型,只不过它的发现像值类型,大概是MS重写了string类的=操作符.也就是说当你给一个string变量赋值时实际等于new了一个新对象,把那个string变量指向这个新对象,所以说它赋值的表现像值类型.
也是因为方法内,重新开辟了内存保存了new Persion("xxx",99),而不是修改了原内存中的值。static void Send(Person p)
{
p = new Persion("xxx",99);
}
static void Send(string s)
{
s = "222222";
}
上面这个方法了
关键是当你为局部变量s赋值的时候,这个时候s已经被重新构造了。所以和外面的变量不是一个引用,所以你改变这个里面的值和外面的没有关系再看一遍这个:string a = "a";
string b = a;Console.WriteLine(object.ReferenceEquals(a, b));//true——说明引用相同a = "aaa";Console.WriteLine(object.ReferenceEquals(a, b));//false——说明引用不同想想为什么在改变a的值前后,为什么改变了a的引用
//第一组
string a = "a";
string b = a;Console.WriteLine(object.ReferenceEquals(a, b));//true——说明引用相同a = "aaa";Console.WriteLine(object.ReferenceEquals(a, b));//false——说明引用不同//第二组
Person p = new Person("ddd", 10);
Person p2 = p;Console.WriteLine(object.ReferenceEquals(p, p2));//true——说明引用相同p = new Person("aaa",22);Console.WriteLine(object.ReferenceEquals(p, p2));//false——说明引用不同
注意:只是用的时候这么看。
使形参和实参具有相同的对象引用,从而使形参和实参指向同一对象,在这个例子中send(string)使形参分配一个新的对象引用“222222“从而使形参指向一个新的string,但这不影响实参的对象引用,也就是说实参仍指向原对象,所以输出的值不会因send(string)而改变,对于send(person)只是对所指对象的成员进行赋值,并没有分配一个新的对象引用,所以形参和实参指向同一对象,对形参所指对象的任何改变反映到实参所指对象。所以send(person)后实参所指对象的成员改变。
这个确实。 不是string,换个引用类型,也是一个道理。