求C#大神,打开一个窗体,传过去一个对象,修改该对象数据后传过来的对象为什么数据也跟着修改?

.Net技术 码拜 9年前 (2015-05-10) 997次浏览 0个评论

如标题,自己写了一个查询数据窗体,双击某一行显示该行的详细信息,传过去一个对象DrugDictEntity,名称为DrugDict,修改窗体后的数据之后,保存赋值到对象DrugDictEntity  dic 变量中,发现之前传过来的对象DrugDictEntity  DrugDict 的数据也跟着修改,也就是DrugDict 和 dic中的数据完全一样,不知道什么原因,还是就这种机制?

ps:想做一个日志,就是保存修改数据之前的老数据和修改完数据之后的新数据

1分
就是这种机制,如果不想这样跟着改,应该考虑不用对象传递!
8分
引用 楼主 lin370832 的回复:

如标题,自己写了一个查询数据窗体,双击某一行显示该行的详细信息,传过去一个对象DrugDictEntity,名称为DrugDict,修改窗体后的数据之后,保存赋值到对象DrugDictEntity  dic 变量中,发现之前传过来的对象DrugDictEntity  DrugDict 的数据也跟着修改,也就是DrugDict 和 dic中的数据完全一样,不知道什么原因,还是就这种机制?

ps:想做一个日志,就是保存修改数据之前的老数据和修改完数据之后的新数据

对象是引用类型,dic和你传过去的对象指向同一块地址,修改是对同一块地址修改。
可以维护两个DrugDictEntity变量,作为对比生成修改日志。

引用 2 楼 lovelj2012 的回复:
Quote: 引用 楼主 lin370832 的回复:

如标题,自己写了一个查询数据窗体,双击某一行显示该行的详细信息,传过去一个对象DrugDictEntity,名称为DrugDict,修改窗体后的数据之后,保存赋值到对象DrugDictEntity  dic 变量中,发现之前传过来的对象DrugDictEntity  DrugDict 的数据也跟着修改,也就是DrugDict 和 dic中的数据完全一样,不知道什么原因,还是就这种机制?

ps:想做一个日志,就是保存修改数据之前的老数据和修改完数据之后的新数据

对象是引用类型,dic和你传过去的对象指向同一块地址,修改是对同一块地址修改。
可以维护两个DrugDictEntity变量,作为对比生成修改日志。

脑袋短路了,一语惊醒梦中人

引用 2 楼 lovelj2012 的回复:
Quote: 引用 楼主 lin370832 的回复:

如标题,自己写了一个查询数据窗体,双击某一行显示该行的详细信息,传过去一个对象DrugDictEntity,名称为DrugDict,修改窗体后的数据之后,保存赋值到对象DrugDictEntity  dic 变量中,发现之前传过来的对象DrugDictEntity  DrugDict 的数据也跟着修改,也就是DrugDict 和 dic中的数据完全一样,不知道什么原因,还是就这种机制?

ps:想做一个日志,就是保存修改数据之前的老数据和修改完数据之后的新数据

对象是引用类型,dic和你传过去的对象指向同一块地址,修改是对同一块地址修改。
可以维护两个DrugDictEntity变量,作为对比生成修改日志。

那我应该怎么赋值呢?不能直接==赋值吧,也不能直接属性属性之间赋值吧,这样太麻烦了,有没有一个简单的方法

1分
那就用定义两个全局变量 一个用来传递新数据库 一个用来传递老的数据
5分
引用 4 楼 lin370832 的回复:
Quote: 引用 2 楼 lovelj2012 的回复:
Quote: 引用 楼主 lin370832 的回复:

如标题,自己写了一个查询数据窗体,双击某一行显示该行的详细信息,传过去一个对象DrugDictEntity,名称为DrugDict,修改窗体后的数据之后,保存赋值到对象DrugDictEntity  dic 变量中,发现之前传过来的对象DrugDictEntity  DrugDict 的数据也跟着修改,也就是DrugDict 和 dic中的数据完全一样,不知道什么原因,还是就这种机制?

ps:想做一个日志,就是保存修改数据之前的老数据和修改完数据之后的新数据

对象是引用类型,dic和你传过去的对象指向同一块地址,修改是对同一块地址修改。
可以维护两个DrugDictEntity变量,作为对比生成修改日志。

那我应该怎么赋值呢?不能直接==赋值吧,也不能直接属性属性之间赋值吧,这样太麻烦了,有没有一个简单的方法

1、接收DrugDictEntity的窗体,深度拷贝该对象
2、使用变量接收DrugDictEntity的属性

4分
在实体类里实现个Copy或Clone函数,需要赋值的时候调用呗

如果你只需要赋值一次,而不是到处赋值,直接属性对属性也可以.

自定义实体类只能属性赋值给属性,你得自己实现深拷贝

求C#大神,打开一个窗体,传过去一个对象,修改该对象数据后传过来的对象为什么数据也跟着修改?

我现在是这么赋值的,但是不能直接相等赋值,因为这样的话两个对象指向的是同一个地址,这样修改其中一个对象的话,则另一个也会修改,这并不能实现我所要实现的修改日志

我去,我直接是这么写的,居然可以?

DrugDictEntity drugOld = new DrugDictEntity(); //定义一个老数据对象变量
drugOld = drugDict.Clone(); //把当前传过来的对象克隆给变量,这样,对象 drugDict 和 drugOld  就分离了,数据互不影响

1分
赋值的时候只能是基本类型的赋值给基本类型的,如果是引用类型的肯定就不行了。如果里面还有引用类型的话,就还需要进一步把里面的值也给克隆一下。

int ID = 0;
TestClass testClass = new TestClass();

Public void Clone(DrugDictEntity oldData)
{
    DrugDictEntity obj = new DrugDictEntity();
    obj.ID = this.ID;
    // 在TestClass里面也做一个Clone()方法,类似这个。
    obj.testClass = this.testClass.Clone();
}


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求C#大神,打开一个窗体,传过去一个对象,修改该对象数据后传过来的对象为什么数据也跟着修改?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!