日期:2014-05-18  浏览次数:20873 次

一道面试题,求结果,求原理
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";

求理由

值还是原来的 我调试了 就是不知道原理

------解决方案--------------------
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 进行修饰。 通过引用传递值类型时没有值类型装箱。
------解决方案--------------------
探讨
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,s2的值,很简单,加个ref就行了,如:
C# code

public void Swap(ref object a,ref object b)
{
object temp = a;
a = b;
b = temp;
}


调用的时候这个样子就行……

------解决方案--------------------
小风风~~~

这两天我也突然想到了这个问题一直在纠结,正打算发帖呢,以前在传递引用类型的时候,如果在方法中需要修改传递的引用类型的参数我都要加ref。

这两天我突然想到既然引用类型传递的是引用那就因该是地址了,那如果是地址的话,在方法中就指向同一个地址喽,为什么会不修改传进去的参数的原始值呢?

对于【41楼】解释,我不太理解啊:

————“可以把形参 a 和实参 s1 理解成指向同一个对象的指针,修改了 a 的所指,不会影响到 s1。仅此而已”————

难道传递进去后形参a和实参s1指向的不是一个地址码?在方法中会另外开辟一个内存地址来存放传进来的s1的值,然后形参a指向这个新的地址??

求详细解释。