C#引用类型强制值传递

qq_38589020 2017-12-15 05:34:16
A、B、C是同一种类型,现在我要
B=A;
C=B;
对C的修改不影响A,应该怎么弄。
...全文
369 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2017-12-16
  • 打赏
  • 举报
回复
引用 6 楼 qq_17486399 的回复:
[quote=引用 2 楼 xuzuning 的回复:] 连续的赋值操作不会影响原始数据,这是正常的的。也是合乎逻辑的 特殊情况下,你还可以用 clong() 来切断联系
大兄弟,如果我没记错应该是clone()[/quote] 你好聪明哦,clone 和 clong 是有程度上的差异的
Jason_Mao1 2017-12-16
  • 打赏
  • 举报
回复
用值类型的 数据类型试试,或者是用拷贝的方式试试。class 是引用类型。
大鱼> 2017-12-16
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
连续的赋值操作不会影响原始数据,这是正常的的。也是合乎逻辑的 特殊情况下,你还可以用 clong() 来切断联系
大兄弟,如果我没记错应该是clone()
秋的红果实 2017-12-16
  • 打赏
  • 举报
回复
深度复制,也就是写个方法,专门处理将A的值付给B(B到C也一样),凡碰到引用类型的成员,都需要先new一个临时变量tempField1,然后通过tempField1“传值”,例如 theType tempField1=new theType(); tempField1=A.Field1; B.Field1=tempField1; 对于值类型,直接赋值即可,如 B.Field2=A.Field2; 对 对象,不能B=A这么直接赋值,需要将A里面所有成员的值赋值给B对应的每个成员;特别注意对于引用类型成员的复制,需要像我上面那样处理
threenewbee 2017-12-15
  • 打赏
  • 举报
回复
也可以定义成结构体(struct)代替class
threenewbee 2017-12-15
  • 打赏
  • 举报
回复
实现Clone方法,拷贝一个,或者在函数里拷贝
圣殿骑士18 2017-12-15
  • 打赏
  • 举报
回复
二楼的方法是浅拷贝,如果你的a对象的成员都是基础类型或者是string类型,那么够用了。 如果a的成员还包括了对象,那么浅表复制,复制的对象成员,仍然是引用。这时候需要用深拷贝。但这种做法效率低,一般也很少碰到。 以下是一个深拷贝的方法,实际上就是碰到对象成员就递归处理。

/// <summary>
        /// 类之间深拷贝
        /// </summary>
        /// <param name="obj">源型类对象</param>
        /// <returns></returns>
        public static object CopyObject(this object obj)
        {
            Object targetDeepCopyObj = null;

            //需判断是否为Null
            if (obj == null) return targetDeepCopyObj;

            Type targetType = obj.GetType();
            
            if (targetType.IsValueType == true)
            {
                //值类型
                targetDeepCopyObj = obj;
            }            
            else
            {
                //引用类型
                targetDeepCopyObj = System.Activator.CreateInstance(targetType);   //创建引用对象 
                System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers();

                foreach (System.Reflection.MemberInfo member in memberCollection)
                {
                    if (member.MemberType == System.Reflection.MemberTypes.Field)
                    {
                        System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member;
                        Object fieldValue = field.GetValue(obj);
                        if (fieldValue is ICloneable)
                        {
                            field.SetValue(targetDeepCopyObj, (fieldValue as ICloneable).Clone());
                        }
                        else
                        {
                            field.SetValue(targetDeepCopyObj, CopyObject(fieldValue));
                        }
                    }
                    else if (member.MemberType == System.Reflection.MemberTypes.Property)
                    {
                        System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member;
                        MethodInfo info = myProperty.GetSetMethod(false);
                        if (info != null)
                        {
                            object propertyValue = myProperty.GetValue(obj, null);
                            if (propertyValue is ICloneable)
                            {
                                myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null);
                            }
                            else
                            {
                                myProperty.SetValue(targetDeepCopyObj, CopyObject(propertyValue), null);
                            }
                        }

                    }
                }
            }
            return targetDeepCopyObj;
        }
xuzuning 2017-12-15
  • 打赏
  • 举报
回复
连续的赋值操作不会影响原始数据,这是正常的的。也是合乎逻辑的 特殊情况下,你还可以用 clong() 来切断联系
正怒月神 2017-12-15
  • 打赏
  • 举报
回复
public class User
        {
            public int id { get; set; }
            public virtual string name { get; set; }
            public virtual string buyer { get; set; }
            public virtual string idArr { get; set; }

            public User Copy()
            {
                return (User)this.MemberwiseClone();
            }
        }

        static void Main(string[] args)
        {
            
            User u = new User() { id=1};
            User u1 = u;
            u1.id = 2;
            Console.WriteLine(u.id);    //u的id=2  变化了

            User u2 = u.Copy();
            u2.id = 3;
            Console.WriteLine(u.id);    //u的id=2  没有变化

            Console.ReadLine();
        }

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧