一道面试题,求结果,求原理
C# code
public void Swap(object a,object b)
{
object temp=a;
a=b;b=temp;
}
string s1="1111";
string s1="2222";
Swap(s1,s2);
--执行完Swap 方法后 s1,s2的值是什么?求理由
------解决方案--------------------s1="1111";
s2="2222";
------解决方案--------------------又没对S1 S2进行任何操作,肯定值还是保持你声明的时候的值。
------解决方案--------------------理由只有一个: 引用传参其实是副本,除非你添加ref强制传递地址。
看下面:
public void Modify(DataTable dt)
{
dt = new DataTable();
}
此方法执行后,dt还是原来的dt。不是新对象
--------------------------------------
另一个:
public void Modify(DataTable dt)
{
dt.Rows[0]["dd"] = "dir";
}
此方法执行后,你发现单元格被修改了。
------解决方案--------------------值肯定还是原来的啊 因为没有用out 而且S1 S2也不是静态变量
------解决方案--------------------
------解决方案--------------------s1="1111",s2="2222",解释:调用函数传递的是值参,在swap函数中的操作不会影响main函数里面的参数。
------解决方案--------------------string 和值类型差不多,值交换是a,b的交换,不影响s1,s2
如果s1,s2是引用类型值才会变
------解决方案--------------------值传递时只不过是对原始数据副本的操作 对原始数据没有影响
引用传递传递进去的是指针
默认的为值传递
C# code
static void Main(string[] args)
{
string s1 = "111111";
string s2 = "222222";
Swap(ref s1, ref s2);
Console.WriteLine(string.Format("s1:{0},s2:{1}", s1, s2));
Console.Read();
}
public static void Swap(ref string a,ref string b)
{
string temp = a;
a = b; b = temp;
}
------解决方案--------------------
首先你的程序写错了,第二个字符串变量名应该是s2;
其次结果应该是:s1="1111";s2="2222";
为什么捏?
不要将“通过引用传递”概念与“引用类型”概念相混淆。 这两个概念不同。 方法参数无论是值类型还是引用类型,都可通过 ref 进行修饰。 通过引用传递值类型时没有值类型装箱。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
小风风~~~
这两天我也突然想到了这个问题一直在纠结,正打算发帖呢,以前在传递引用类型的时候,如果在方法中需要修改传递的引用类型的参数我都要加ref。
这两天我突然想到既然引用类型传递的是引用那就因该是地址了,那如果是地址的话,在方法中就指向同一个地址喽,为什么会不修改传进去的参数的原始值呢?
对于【41楼】解释,我不太理解啊:
————“可以把形参 a 和实参 s1 理解成指向同一个对象的指针,修改了 a 的所指,不会影响到 s1。仅此而已”————
难道传递进去后形参a和实参s1指向的不是一个地址码?在方法中会另外开辟一个内存地址来存放传进来的s1的值,然后形参a指向这个新的地址??
求详细解释。