none
获取引用类型参数的值对象 !(高手......) RRS feed

  • 问题


  • 有一个方法,带有一个复杂集合参数,比如说List<Object> 类型的ListSender。
    在方法内我将这个传进来的参数ListSender复制给一个相同类型的变量MyList。但是以后ListSender如果发生改变,对于MyList没有任何影响。

    也就是引用类型参数传递一个值类型的数据 !
    2009年9月29日 3:10

答案

  • Jiyuan 用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌:非常感谢你 !

                 事实正如你所说的那样 !谢谢.....

    这一秒不放弃,下一秒就有奇迹 !

    不客气啊,请结贴以方便后来人。(标记您认为对的为答案即可。)
    • 已标记为答案 Matol 2009年9月30日 6:45
    2009年9月30日 6:42

全部回复

  • 你好!
         你可以在“复制”的时候不要使用“="来复制,而是自己写方法来实现”深拷贝“:
          可以写一个循环,把ListSender的每一个元素都复制到MyList中,至于对每一个元素是否”深拷贝“,可以根据你的需求自己决定!
        
    周雪峰
    2009年9月29日 3:32
    版主
  • 你好!

    我写了个简单的示例,如下:

    class Program
    {
        static void Main(string[] args)
        {
            List<object> lst1 = new List<object>(); 
            List<object> lst2 = new List<object>();
            List<object> lst3 = new List<object>();
    
            Test1(lst1);
            Test2(lst2);
            Test3(ref lst3);
        }
    
        static void Test1(List<object> objList)
        {
            // objList 是值类型,但objList 中的项是引用类型,所以执行后 lst1 有值
            objList.Add(1);
        }
    
        static void Test2(List<object> objList)
        {
            // objList 是值类型 所以执行后 lst2 没有值
            List<object> lst = new List<object>();
            lst.Add(1);
            objList = lst;
        }
    
        static void Test3(ref List<object> objList)
        {
            // objList 是值类型, 但我们使用了 ref 关键字,所以执行后 lst3 有值
            List<object> lst = new List<object>();
            lst.Add(1);
            objList = lst;
        }
    }


    知识改变命运,奋斗成就人生!
    2009年9月29日 3:36
    版主
  • 你好引用类型当使用=赋值 实际上是把其值对象的地址传给了新的这个变量,当这个变量更改时 所做的更改都是通过这个地址去对那个值进行更改 所以之前的变量也会发生相应的更改

    而值类型则是直接将值的一个副本赋值给新的这个变量,当这个变量做出修改时不会引起之前在这个值类型变量的更改

    如果要使得值类型可以被更改 使用ref或者out关键字
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月29日 3:57
    版主
  •  我要的结果是:
              在调用方法时将传进来的引用类型参数的值 深复制到一个变量里。方法执行完以后,该引用无论发生任何改变,该变量都不变化 !

    OK.....
    2009年9月29日 4:52
  • 你好!

    我写了个简单的示例,如下:

    class
     Program
    {
        static
     void
     Main(string
    [] args)
        {
            List<object
    > lst1 = new
     List<object
    >(); 
            List<object
    > lst2 = new
     List<object
    >();
            List<object
    > lst3 = new
     List<object
    >();
    
            Test1(lst1);
            Test2(lst2);
            Test3(ref
     lst3);
        }
    
        static
     void
     Test1(List<object
    > objList)
        {
            // objList 是值类型,但objList 中的项是引用类型,所以执行后 lst1 有值
    
            objList.Add(1);
        }
    
        static
     void
     Test2(List<object
    > objList)
        {
            // objList 是值类型 所以执行后 lst2 没有值
    
            List<object
    > lst = new
     List<object
    >();
            lst.Add(1);
            objList = lst;
        }
    
        static
     void
     Test3(ref
     List<object
    > objList)
        {
            // objList 是值类型, 但我们使用了 ref 关键字,所以执行后 lst3 有值
    
            List<object
    > lst = new
     List<object
    >();
            lst.Add(1);
            objList = lst;
        }
    }
    


    知识改变命运,奋斗成就人生!

    XXY版主,你好!
    objList应该是引用类型吧!
    周雪峰
    2009年9月29日 4:58
    版主
  • 你好!

    抱歉刚才误解了你的意思,参看下面的代码

    class Program
    {
        static void Main(string[] args)
        {
            List<object> objList = new List<object>();
    
            objList.Add(123);
            objList.Add(new DataTable());
            Test(new List<object>(objList.ToArray()));
            
        }
    
        static void Test(List<object> objList)
        {
            objList.Add(234);
        }
    }


    知识改变命运,奋斗成就人生!
    2009年9月29日 5:05
    版主
  • lz您好,

    试试以下代码,看是不是您要的效果:
                List<object> oldList = new List<object>();
                oldList.Add(1);
                List<object> newList = oldList.ToArray().ToList(); //为了使用ToList()需要引用using System.Linq;
                newList.Add(2);

     newList改变后不会影响oldList.
    2009年9月29日 7:24
  • 很感谢大家 !

    我需要的效果如Jiyuan 用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌所说的那样,但是最后一句他说反了, 意思全变了 !

                List<object> oldList = new List<object>();
                oldList.Add(1);

                List<object> newList = oldList.ToArray().ToList(); //为了使用ToList()需要引用using System.Linq;
                newList.Add(2);

    oldList改变后不会影响newList.
    2009年9月29日 9:37
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    using System.Drawing;

    namespace ConsoleApplication1
    {
        /// <summary>
        ///  有关GDI+ 的简单数据类
        /// </summary>
        public class MyGDI
        {
            private Brush m_MyBrush;
            public Brush MyBrush
            {
                get { return m_MyBrush; }
                set { m_MyBrush = value; }
            }

            private Color m_Color;
            public Color Color
            {
                get { return m_Color; }
                set { m_Color = value; }
            }

            public MyGDI() { }
            public MyGDI(Brush myBrush, Color myColor)
            {
                this.m_MyBrush = myBrush;
                this.m_Color = myColor;
            }

        }

        class Program
        {
            static void Main(string[] args)
            {
                //源数据
                List<MyGDI> OldList = new List<MyGDI>();
                OldList.Add(new MyGDI(Brushes.Red, Color.Red));
                OldList.Add(new MyGDI(Brushes.Blue, Color.Blue));

                //复制源数据
                List<MyGDI> NewList = new List<MyGDI>();
                NewList = CopyOldList(OldList);

                //我的目的就是复制以后源数据发生改变以后,复制的NewList数据不发生任何改变
                OldList.Clear();
            }

            //我的目的就是将传入的数据复制一份返回,是复制OldList该集合的值对象,而不是引用
            public static List<MyGDI> CopyOldList(List<MyGDI> OldList)
            {
                return null;
            }

        }
    }


    这一秒不放弃,下一秒就有奇迹 !
    2009年9月29日 10:01
  • 楼主,您好。

           原理不变,当list调用ToArray()时即是在copy。

            public static List<MyGDI> CopyOldList(List<MyGDI> OldList)
            {
                return OldList.ToArray().ToList();
            }
    • 已建议为答案 mldark 2009年9月30日 2:43
    2009年9月29日 10:46
  • Jiyuan 用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌:非常感谢你 !

                 事实正如你所说的那样 !谢谢.....

    这一秒不放弃,下一秒就有奇迹 !
    2009年9月30日 1:05
  • Jiyuan 用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌:非常感谢你 !

                 事实正如你所说的那样 !谢谢.....

    这一秒不放弃,下一秒就有奇迹 !

    不客气啊,请结贴以方便后来人。(标记您认为对的为答案即可。)
    • 已标记为答案 Matol 2009年9月30日 6:45
    2009年9月30日 6:42