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

解决方案 »

  1.   

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

  2.   

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

  3.   

    结果是:s1="2222"
    s2="1111"
      object temp=a;  //temp=>a 
      a=b;            //a=>b      a="2222" 
      b=temp;        //b=>temp=>a b="1111"
      

  4.   

    理由只有一个: 引用传参其实是副本,除非你添加ref强制传递地址。看下面:public void Modify(DataTable dt)
    {
        dt = new DataTable();
    }此方法执行后,dt还是原来的dt。不是新对象--------------------------------------另一个:public void Modify(DataTable dt)
    {
        dt.Rows[0]["dd"] = "dir";
    }
    此方法执行后,你发现单元格被修改了。
      

  5.   

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

  6.   

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

  7.   

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

  8.   

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

  9.   

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

  10.   

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

  11.   

    如果你想调换一下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;
      

  12.   


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

  13.   


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

  14.   

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

  15.   

    string s1="1111";
    string s1="2222";很基础的问题 楼主 
      

  16.   

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

  17.   


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

  18.   

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

  19.   

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

  20.   


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

  21.   

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

  22.   

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

  23.   

    小风风~~~这两天我也突然想到了这个问题一直在纠结,正打算发帖呢,以前在传递引用类型的时候,如果在方法中需要修改传递的引用类型的参数我都要加ref。这两天我突然想到既然引用类型传递的是引用那就因该是地址了,那如果是地址的话,在方法中就指向同一个地址喽,为什么会不修改传进去的参数的原始值呢?对于【41楼】解释,我不太理解啊:————“可以把形参 a 和实参 s1 理解成指向同一个对象的指针,修改了 a 的所指,不会影响到 s1。仅此而已”————难道传递进去后形参a和实参s1指向的不是一个地址码?在方法中会另外开辟一个内存地址来存放传进来的s1的值,然后形参a指向这个新的地址??求详细解释。
      

  24.   

    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并没有改变!
      

  25.   

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

  26.   

    在java中,简单类型的参数是值传递,而如果是其他对象的话则是地址传递,而String属于简单类型,所以是 1111 和2222,你可以试着建一个bean的两个对象,再调用,应该会互换。
      

  27.   

    没有任何变化,除非改成以下形式:public void Swap(ref object a, ref object b)
    {
       ...
    }
      

  28.   

    我试着定义了两个引用类型然后用swap方法做交换,结果没有变化。但是如果修改一个引用类型中的值类型却能够有效果。这是为什么呢?
      

  29.   

    字符串不变指的是比如
    var a="111";
    a="222"; 这个情况下,a本来指向的"111"这个字符串对象并没有被更改成"222",而是a的引用现在指向了一个新的字符串对象"222"
    LZ的这个题目的原因在于 传入的虽然是引用 但是事实上是引用的一份 拷贝, 虽然在方法内部交换了引用 但是对于外部来说 由于你传进去的是自身引用的拷贝 所以实际上没有任何影响
      

  30.   


    请教,如果形参是传入引用的拷贝,那么为什么        private static void ChangeContent(DataTable dt, int colIndex, int rowIndex)
            {
                dt.Rows[rowIndex][colIndex] = "Changed";
            }
    当我调用这个方法的时候,外面的dt中的值也跟着变了呢?真的不理解,请帮忙。
      

  31.   

    看你这个帖子,我回复到另一个帖子了http://topic.csdn.net/u/20090722/19/356762ca-d13a-4e69-a2b5-9a19a0182d46_3.html
    贴过来:static void teststring(string s){s += "A1";}
    static void testref(List<string> l) //引用类型{l.Add("hello");}static void Main(string[] args){List<string> l1 = new List<string>();l1.Add("hi");testref(l1);l1.ToList().ForEach(n => Console.Write(n + " "));//hi hellostring str = "A2";teststring(str);Console.WriteLine(str);//A2}
      

  32.   

    对于引用类型加不加ref都是一样的,但对于值类型和string这种特殊的类型来说是不一样的。
    static void teststring(ref string s)
            {            s += "A1";        }
            static void testref(ref List<string> l) //引用类型
            {            l.Add("hello");        }        static void Main(string[] args)
            {            List<string> l1 = new List<string>();            l1.Add("hi");            testref(ref l1);            l1.ToList().ForEach(n => Console.Write(n + " "));//hi hello            string str = "A2";            teststring(ref str);            Console.WriteLine(str);//A2A1
                Console.Read();        }
      

  33.   

    首先申明了一个temp中间变量 然后把a的值传给temp 再把b的值传给a 最后把temp的值传给b 就等于首先把a和b的值调换了 就算再怎么调换 因为没有值 所以肯定不会影响下面的S1和S2值的改变的啊 所以最后S1="1111" S2="2222"
      

  34.   

    画堆栈图一下就解开了,传进去的是引用副本,如果想要调换S1和S2,则需要传送它们的实际引用,就要用到ref了
      

  35.   

    http://wenku.baidu.com/view/2a43bd176edb6f1aff001f73.html这有值类型与引用类型的详细介绍
      

  36.   

    搞的好复杂啊,这道题就是考你,string类型 到底是值类型还是引用类型,跟大学考试的选择题一样......只不过换了种形式出题而已... ...有必要这么纠结么。
      

  37.   

    string 是特殊的引用类型
    string str="123";
    string str1= str;
    str1="234";//这时str等于多少??
     
    普通的引用类型,
    public class a
    {
     public int c;
    }
    a a1= new a();
    a1.c=10;
    a a2 = a1;
    a2.c =100;//这时 a1.c等于多少?
    ====================
    ps:这是基本的知识
      

  38.   

    值保持不变,因为C#默认是传值方式传递参数,如要传递引用,需使用ref或out关键字
      

  39.   

    道理其实很简单在C#中,方法是通过复制来传递参数的,引用型变量只包含对对象的引用,方法复制的是该引用,而不是对象本身,所以对底层对象的修改依旧会保留下来。而对值类型变量,由于其含有实际数据,方法得到的只是该变量的复制,方法对变量所做的任何变量并不影响原来变量。string稍微复杂一点,它是一个不可变的数据类型,一旦字符串对象初始化,该字符串对象就不会改变了,表面上修改字符串的方法和运算符实际上是重新创建了一个新的对象,因此在调用方法中对字符串所做的任何改变都不会影响原字符串。(详见《c#高级编程第七版》第三章:对象和类型)http://blog.csdn.net/songsz123/article/details/7306870
      

  40.   

    在这道题目中,调用到的函数swap中,只是复制了一份a和b的值,请注意只是复制,然后在swap的定义完成后,什么也没有返回,形参就释放掉了,所以还是原来的值,如果要改变为原来的值,需要用引用来修改。
      

  41.   

    public void Swap(object a,object b)
    {
       object temp=a;
       a=b;b=temp;
    }
    string s1="1111";
    string s2="2222";
    Swap(s1,s2);
    没有对 s1,s2 进行操作  
    你可以 你可以在 swap里面输出 a b  
      

  42.   

    我晕,有些人不知道就不要乱说,好不好。
    其实这就是装箱 和 拆箱的问题。
    string 是值类型,虽然他被装箱了,但是程序只是在堆里开辟一段内存,用以拷贝string对象。所以封装后的对象和封装前的对象完全指向两个不同内存段,你的Swap语句根本就是在操纵装箱后的对象,这样你Swap以后根本,原来的string对象根本就没有反应!
      

  43.   

    我表示对你无语了,String是引用类型(虽然它具有值类型的一些特征,依然是引用类型),装什么箱。
      

  44.   

    string 转 object不需要装箱吗?
      

  45.   

    Yes, 93楼正解, String本质上是引用类型,但是却表现出值类型的特征。参数在方法中传递时如果是值类型会拷贝副本,Swap实际上是对参数的副本做了操作,所以没有影响到原值。
      

  46.   

    string str1 ="a";会在托管堆里申请一段空间
    str1="b";//继续会在托管堆里申请一段空间。原来申请的会引用丢失。gc后直接回收
      
    swap()方法传进来的时候,string 虽然是引用类型,但是MS做了处理,他只是吧string的副本传进来了。即重新申请了2个变量过来的。即方法体力2个东西和外面的两个东西引用地址都不一样的。
    所以你这个在怎么变。
    object temp=a;
      a=b;b=temp;
    都是不会改变外面的变量的。除非ref 
      

  47.   

    string 可以看作是特殊的引用类型(MS动了手脚),对string 重新赋值相当于new 了一个新string,原来的是没有影响。
      

  48.   

    C# string 不是传引用object哦....  object s1="1111";
    object s2="2222";