一道面试题,求结果,求原理

时间:2022-04-28 11:28:40

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的值是什么?求理由

106 个解决方案

#1


自己  UP

#2


s1="1111";
s2="2222";

#3


俩个值对换了一下

#4


先把A的值赋值给中间变量,在把B的值赋给A。在把中间变量的值赋值给A。最后结果A=“2222” B=“1111”

#5


引用 2 楼  的回复:
s1="1111";
s2="2222";

求理由

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

#6


引用 4 楼  的回复:
先把A的值赋值给中间变量,在把B的值赋给A。在把中间变量的值赋值给A。最后结果A=“2222” B=“1111”

先把A的值赋值给中间变量,在把B的值赋给A。在把中间变量的值赋值给B。最后结果A=“2222” B=“1111”

#7


又没对S1 S2进行任何操作,肯定值还是保持你声明的时候的值。

#8


引用 2 楼  的回复:
s1="1111";
s2="2222";


+1

#9


结果是:

s1="2222"
s2="1111"
  object temp=a;  //temp=>a 
  a=b;            //a=>b      a="2222" 
  b=temp;        //b=>temp=>a b="1111"

#10


引用 7 楼  的回复:
又没对S1 S2进行任何操作,肯定值还是保持你声明的时候的值。


up

#11


理由只有一个: 引用传参其实是副本,除非你添加ref强制传递地址。

看下面:

public void Modify(DataTable dt)
{
    dt = new DataTable();
}

此方法执行后,dt还是原来的dt。不是新对象

--------------------------------------

另一个:

public void Modify(DataTable dt)
{
    dt.Rows[0]["dd"] = "dir";
}
此方法执行后,你发现单元格被修改了。

#12


值肯定还是原来的啊 因为没有用out 而且S1 S2也不是静态变量

#13


手头没有VS 不过目测是S1=2222,S1=1111 原因是里面进行了交换 但是不是值的交换 而是引用的交换 

#14


一道面试题,求结果,求原理
弄错 原来你的s1 s2 在外面的啊 那就还是原来的值

#15


引用 13 楼  的回复:
手头没有VS 不过目测是S1=2222,S1=1111 原因是里面进行了交换 但是不是值的交换 而是引用的交换


你还得再努力啊,唉。。。。。。

#16


好吧 忘了是引用的拷贝了~~~~~
引用 15 楼  的回复:
引用 13 楼  的回复:
手头没有VS 不过目测是S1=2222,S1=1111 原因是里面进行了交换 但是不是值的交换 而是引用的交换


你还得再努力啊,唉。。。。。。

#17


引用 5 楼  的回复:
引用 2 楼 的回复:
s1="1111";
s2="2222";

求理由

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

最简单的解释,从方法调用来说。

调用一个方法,需要传递参数,这里一般是两种情况,
1,对于引用类型,是把这个引用类型的“引用”拷贝一份传进去,你可以理解为传过去一个指针。当你在方法中更改这个引用的适合,其实就是更改你拿到的那个指针,也就是那个“引用”的拷贝。所以,更改引用的行为对于原本的那个引用没有任何影响,这就好像我告诉你,我住在幸福大街520号,然后你记在一个单子上,大帅哥,住址:幸福大街520号。你可以按照这个地址找到我,与我进行沟通。但是如果你把单子上的东西改了,大帅哥,住址:痛苦大路250号,那么你按照这个地址找到的不是我,我还住在幸福大街520号,我没有因为你改了单子而搬家。
2,对于值类型,是把这个值类型的对象本身的拷贝传进去,就是复制了一个一模一样的值类型对象。当你在方法内更改这个对象的时候,本质也就是更改一个副本,对原本的对象没有任何影响。

#18


s1="1111",s2="2222",解释:调用函数传递的是值参,在swap函数中的操作不会影响main函数里面的参数。

#19


string 和值类型差不多,值交换是a,b的交换,不影响s1,s2
如果s1,s2是引用类型值才会变

#20


值传递时只不过是对原始数据副本的操作 对原始数据没有影响
引用传递传递进去的是指针  
默认的为值传递
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;
        }

这样就会s1="2222"
s2="1111"

#21


首先你的程序写错了,第二个字符串变量名应该是s2;
其次结果应该是:s1="1111";s2="2222";
为什么捏?
不要将“通过引用传递”概念与“引用类型”概念相混淆。 这两个概念不同。 方法参数无论是值类型还是引用类型,都可通过 ref 进行修饰。 通过引用传递值类型时没有值类型装箱。

#22


如果你想调换一下s1,s2的值,很简单,加个ref就行了,如:

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

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

            string s1 = "1111";
            string s2 = "2222";

            object o1 = s1;
            object o2 = s2;

            Swap(ref o1, ref o2);
 
            this.textBox1.Text = (string)o1;
            this.textBox2.Text = (string)o2;

#23


引用 2 楼  的回复:
s1="1111";
s2="2222";


swap()  交换

i=1
j=2
swap(i,j)
i=2
j=1赞同1| 评论 

#24


引用楼主  的回复:
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的值是什么?求理由


LZ应该看看马士兵讲的java的视频,这个问题类似于C中的值传递。

#25


這個面試題主要考什麼呢? 

#26


谢谢 大家,看来我的基础还是不行

#27


还是原来的值 没有变

#28


引用 22 楼  的回复:
如果你想调换一下s1,s2的值,很简单,加个ref就行了,如:
C# code

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


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

错了,是改变o1,o2;s1和s2只能算中间变量(“=”号只能算按值传递的)不变……

#29


感觉楼主没有好好看书...

#30


string s1="1111";
string s1="2222";

很基础的问题 楼主 

#31


引用 11 楼  的回复:
理由只有一个: 引用传参其实是副本,除非你添加ref强制传递地址。

看下面:

public void Modify(DataTable dt)
{
  dt = new DataTable();
}

此方法执行后,dt还是原来的dt。不是新对象

--------------------------------------

另一个:

public void ……


恩。可以这么理解

#32


哪位大大能解释一下,,,,C# / java 中 string到底是值传递还是引用传递啊??? obj-c里面是指定copy就是值传递,retain就是引用传递.

#33


一道面试题,求结果,求原理


.net中 string到底值传递   如果你指定  out ref 就是引用传递  

#34


没有交换值

ref引用

#35


没有返回,C++这样的话可以穿引用过去

#36


这是基础知识:
string类与其它常见的类有一个很大的区别:string类的值是不变的。
这与类的特性没有关系,而是string类的内部实现造成的。

#37


引用 11 楼  的回复:
理由只有一个: 引用传参其实是副本,除非你添加ref强制传递地址。

看下面:

public void Modify(DataTable dt)
{
  dt = new DataTable();
}

此方法执行后,dt还是原来的dt。不是新对象

--------------------------------------

另一个:

public void ……



对的 没有ref都是值引用。。。。 而string的赋值会创建新的string,譬如a=b,实际上是方法内又重新声明了一个a,此a不是传进来的那个a;

#38


引用 36 楼  的回复:
这是基础知识:
string类与其它常见的类有一个很大的区别:string类的值是不变的。
这与类的特性没有关系,而是string类的内部实现造成的。


同意。LZ可以调试一下这个,string a=a+a;注意观察a的各项属性什么的,会有新发现。

#39


值不变。

#40


引用 37 楼  的回复:
引用 11 楼 的回复:
理由只有一个: 引用传参其实是副本,除非你添加ref强制传递地址。

看下面:

public void Modify(DataTable dt)
{
dt = new DataTable();
}

此方法执行后,dt还是原来的dt。不是新对象

--------------------------------------

另一个:

……



呃 我描述的不太准确,会引起误解。

#41


字符串本身是不可变的,但是这个题和字符串的这个特性没关系。可以把形参 a 和实参 s1 理解成指向同一个对象的指针,修改了 a 的所指,不会影响到 s1。仅此而已

#42


执行完Swap方法后 :
string s1="1111";
string s2="2222";

在swap方法内部:
string s1="2222";
string s2="1111";

#43


该回复于2012-08-02 14:13:41被版主删除

#44


方法传的是引用
方法内部顺序改变了,外部却未改变
S1的地址仍然指向1111
S2的指向2222

#45


小风风~~~

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

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

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

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

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

求详细解释。

#46


两个变量的值是不会变的,这是传的值,又不是地址

#47


你只要记住字符串的不变性就行了

#48


public void Swap(object a,object b)
{
   object temp=a;
   a=b;b=temp;
}
string s1="1111";
string s1="2222";
Swap(s1,s2);


Swap(object a,object b)运行是只是改变了a 和 b的只 s1和s2并没有改变!

#49


 Object类型不是值类型,把string转换成Object后,实际上传递的是string的内存地址,swap函数操作string的内存地址,自然改变了string的实际值

把Object换成string 就不一定了

#50


引用 49 楼  的回复:
 Object类型不是值类型,把string转换成Object后,实际上传递的是string的内存地址,swap函数操作string的内存地址,自然改变了string的实际值

把Object换成string 就不一定了


好吧,我胡扯了

#1


自己  UP

#2


s1="1111";
s2="2222";

#3


俩个值对换了一下

#4


先把A的值赋值给中间变量,在把B的值赋给A。在把中间变量的值赋值给A。最后结果A=“2222” B=“1111”

#5


引用 2 楼  的回复:
s1="1111";
s2="2222";

求理由

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

#6


引用 4 楼  的回复:
先把A的值赋值给中间变量,在把B的值赋给A。在把中间变量的值赋值给A。最后结果A=“2222” B=“1111”

先把A的值赋值给中间变量,在把B的值赋给A。在把中间变量的值赋值给B。最后结果A=“2222” B=“1111”

#7


又没对S1 S2进行任何操作,肯定值还是保持你声明的时候的值。

#8


引用 2 楼  的回复:
s1="1111";
s2="2222";


+1

#9


结果是:

s1="2222"
s2="1111"
  object temp=a;  //temp=>a 
  a=b;            //a=>b      a="2222" 
  b=temp;        //b=>temp=>a b="1111"

#10


引用 7 楼  的回复:
又没对S1 S2进行任何操作,肯定值还是保持你声明的时候的值。


up

#11


理由只有一个: 引用传参其实是副本,除非你添加ref强制传递地址。

看下面:

public void Modify(DataTable dt)
{
    dt = new DataTable();
}

此方法执行后,dt还是原来的dt。不是新对象

--------------------------------------

另一个:

public void Modify(DataTable dt)
{
    dt.Rows[0]["dd"] = "dir";
}
此方法执行后,你发现单元格被修改了。

#12


值肯定还是原来的啊 因为没有用out 而且S1 S2也不是静态变量

#13


手头没有VS 不过目测是S1=2222,S1=1111 原因是里面进行了交换 但是不是值的交换 而是引用的交换 

#14


一道面试题,求结果,求原理
弄错 原来你的s1 s2 在外面的啊 那就还是原来的值

#15


引用 13 楼  的回复:
手头没有VS 不过目测是S1=2222,S1=1111 原因是里面进行了交换 但是不是值的交换 而是引用的交换


你还得再努力啊,唉。。。。。。

#16


好吧 忘了是引用的拷贝了~~~~~
引用 15 楼  的回复:
引用 13 楼  的回复:
手头没有VS 不过目测是S1=2222,S1=1111 原因是里面进行了交换 但是不是值的交换 而是引用的交换


你还得再努力啊,唉。。。。。。

#17


引用 5 楼  的回复:
引用 2 楼 的回复:
s1="1111";
s2="2222";

求理由

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

最简单的解释,从方法调用来说。

调用一个方法,需要传递参数,这里一般是两种情况,
1,对于引用类型,是把这个引用类型的“引用”拷贝一份传进去,你可以理解为传过去一个指针。当你在方法中更改这个引用的适合,其实就是更改你拿到的那个指针,也就是那个“引用”的拷贝。所以,更改引用的行为对于原本的那个引用没有任何影响,这就好像我告诉你,我住在幸福大街520号,然后你记在一个单子上,大帅哥,住址:幸福大街520号。你可以按照这个地址找到我,与我进行沟通。但是如果你把单子上的东西改了,大帅哥,住址:痛苦大路250号,那么你按照这个地址找到的不是我,我还住在幸福大街520号,我没有因为你改了单子而搬家。
2,对于值类型,是把这个值类型的对象本身的拷贝传进去,就是复制了一个一模一样的值类型对象。当你在方法内更改这个对象的时候,本质也就是更改一个副本,对原本的对象没有任何影响。

#18


s1="1111",s2="2222",解释:调用函数传递的是值参,在swap函数中的操作不会影响main函数里面的参数。

#19


string 和值类型差不多,值交换是a,b的交换,不影响s1,s2
如果s1,s2是引用类型值才会变

#20


值传递时只不过是对原始数据副本的操作 对原始数据没有影响
引用传递传递进去的是指针  
默认的为值传递
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;
        }

这样就会s1="2222"
s2="1111"

#21


首先你的程序写错了,第二个字符串变量名应该是s2;
其次结果应该是:s1="1111";s2="2222";
为什么捏?
不要将“通过引用传递”概念与“引用类型”概念相混淆。 这两个概念不同。 方法参数无论是值类型还是引用类型,都可通过 ref 进行修饰。 通过引用传递值类型时没有值类型装箱。

#22


如果你想调换一下s1,s2的值,很简单,加个ref就行了,如:

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

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

            string s1 = "1111";
            string s2 = "2222";

            object o1 = s1;
            object o2 = s2;

            Swap(ref o1, ref o2);
 
            this.textBox1.Text = (string)o1;
            this.textBox2.Text = (string)o2;

#23


引用 2 楼  的回复:
s1="1111";
s2="2222";


swap()  交换

i=1
j=2
swap(i,j)
i=2
j=1赞同1| 评论 

#24


引用楼主  的回复:
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的值是什么?求理由


LZ应该看看马士兵讲的java的视频,这个问题类似于C中的值传递。

#25


這個面試題主要考什麼呢? 

#26


谢谢 大家,看来我的基础还是不行

#27


还是原来的值 没有变

#28


引用 22 楼  的回复:
如果你想调换一下s1,s2的值,很简单,加个ref就行了,如:
C# code

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


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

错了,是改变o1,o2;s1和s2只能算中间变量(“=”号只能算按值传递的)不变……

#29


感觉楼主没有好好看书...

#30


string s1="1111";
string s1="2222";

很基础的问题 楼主 

#31


引用 11 楼  的回复:
理由只有一个: 引用传参其实是副本,除非你添加ref强制传递地址。

看下面:

public void Modify(DataTable dt)
{
  dt = new DataTable();
}

此方法执行后,dt还是原来的dt。不是新对象

--------------------------------------

另一个:

public void ……


恩。可以这么理解

#32


哪位大大能解释一下,,,,C# / java 中 string到底是值传递还是引用传递啊??? obj-c里面是指定copy就是值传递,retain就是引用传递.

#33


一道面试题,求结果,求原理


.net中 string到底值传递   如果你指定  out ref 就是引用传递  

#34


没有交换值

ref引用

#35


没有返回,C++这样的话可以穿引用过去

#36


这是基础知识:
string类与其它常见的类有一个很大的区别:string类的值是不变的。
这与类的特性没有关系,而是string类的内部实现造成的。

#37


引用 11 楼  的回复:
理由只有一个: 引用传参其实是副本,除非你添加ref强制传递地址。

看下面:

public void Modify(DataTable dt)
{
  dt = new DataTable();
}

此方法执行后,dt还是原来的dt。不是新对象

--------------------------------------

另一个:

public void ……



对的 没有ref都是值引用。。。。 而string的赋值会创建新的string,譬如a=b,实际上是方法内又重新声明了一个a,此a不是传进来的那个a;

#38


引用 36 楼  的回复:
这是基础知识:
string类与其它常见的类有一个很大的区别:string类的值是不变的。
这与类的特性没有关系,而是string类的内部实现造成的。


同意。LZ可以调试一下这个,string a=a+a;注意观察a的各项属性什么的,会有新发现。

#39


值不变。

#40


引用 37 楼  的回复:
引用 11 楼 的回复:
理由只有一个: 引用传参其实是副本,除非你添加ref强制传递地址。

看下面:

public void Modify(DataTable dt)
{
dt = new DataTable();
}

此方法执行后,dt还是原来的dt。不是新对象

--------------------------------------

另一个:

……



呃 我描述的不太准确,会引起误解。

#41


字符串本身是不可变的,但是这个题和字符串的这个特性没关系。可以把形参 a 和实参 s1 理解成指向同一个对象的指针,修改了 a 的所指,不会影响到 s1。仅此而已

#42


执行完Swap方法后 :
string s1="1111";
string s2="2222";

在swap方法内部:
string s1="2222";
string s2="1111";

#43


该回复于2012-08-02 14:13:41被版主删除

#44


方法传的是引用
方法内部顺序改变了,外部却未改变
S1的地址仍然指向1111
S2的指向2222

#45


小风风~~~

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

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

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

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

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

求详细解释。

#46


两个变量的值是不会变的,这是传的值,又不是地址

#47


你只要记住字符串的不变性就行了

#48


public void Swap(object a,object b)
{
   object temp=a;
   a=b;b=temp;
}
string s1="1111";
string s1="2222";
Swap(s1,s2);


Swap(object a,object b)运行是只是改变了a 和 b的只 s1和s2并没有改变!

#49


 Object类型不是值类型,把string转换成Object后,实际上传递的是string的内存地址,swap函数操作string的内存地址,自然改变了string的实际值

把Object换成string 就不一定了

#50


引用 49 楼  的回复:
 Object类型不是值类型,把string转换成Object后,实际上传递的是string的内存地址,swap函数操作string的内存地址,自然改变了string的实际值

把Object换成string 就不一定了


好吧,我胡扯了