关于c#中的传值与引用

来源:互联网 发布:海知智能 CTO 编辑:程序博客网 时间:2024/03/29 08:53

今天写了一段小代码.
   情况是这样的:有一个主窗体,N个子窗体.在主窗体中有一些数据,然后将这些数据传给子窗体上显示.子窗体动态实例化.
  数据的形式是datatable的形式,  数据的个数是不定的,在传值的时候,出现的奇怪的现象:当实例化若干个子窗体后,总是只有最后一个子窗体!
大概代码是这样的:
class form2:form
{
......
publie datagridview mygrid=new datagridview();
private void form2_load(....)
{
this.controls.add(mygrid);
}......
}
class mainform:form
{............
List<form2>  form2list=new List<form2>
.....................................................N行后
private void getdata()//填充数据函数
{
Datatable  newtable=dal.getdata(searchInformation);//向newtable填充数据
datagridview g=new datagridview()
g.datasoures=newtable;
form2 f=new form2()
f.mygrid=g;
form2list.add(f);//将f加入泛型form2list中
}
...........
private void button1_clicked(...)//点击事件
{
form2list.show();//i是一个与点击事件相关的index;
}
}
这样以后问题就出来前面所述的问题了,每次实例化form2后就只有最后一次实例化的窗体中的datagridview中有数据,而其它的datagridview中都是空的!!
这是为啥呢?原因在于在c#中"="操作符中有两种作用,对于C# 支持两种类型:“值类型”和“引用类型”。
值类型(Value Type)(如 char、int 和 float)、枚举类型和结构类型。
引用类型(Reference Type) 包括类 (Class) 类型、接口类型、委托类型和数组类型。

所以对于g.datasoures=newtable; 这句代码来说,就是将newtable的地址传给了g.datasoures,而不是值,s所以不同窗体中的datagridview共用一个存储数据的内存!!从而导致了文章开始所叙述的问题.
那么怎么解决这个问题呢?
有两种方法:一,在每次使用newtable的时候都实例化一次,datatable newtable=newdatatable();即重新开辟一段内存;
二:在g.datasoures=newtable语句中改为g.datasoures=newtable.Clone();即向g.datasoures中传入值;

原创粉丝点击