关于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中传入值;
- 关于c#中的传值与引用
- C#中的值类型与引用类型
- C#中的值类型与引用类型
- C#中的值类型与引用类型
- 关于C#中的弱引用
- 关于C#中的弱引用
- C#中的传值 传引用
- C#中的值传递和引用传递,与Java中的值,引用传递用什么不同?
- 关于Python中的引用传值
- 关于java中的值传递与引用传递的见解
- java关于传值与传引用
- 关于二级指针与c++中的引用
- c#解惑 c#中的值和引用
- JAVA中的传值与传引用
- JavaScript中的传值与传引用
- JavaScript中的传值与传引用
- JavaScript中的传值与传引用
- JavaScript中的传值与传引用
- 黑客从哪里开始?
- 在 Jsp 页面中使用 JavaBean
- 面试题精选(72):设计含min函数的队列
- request.getContextPath();
- Hook与AOP
- 关于c#中的传值与引用
- Head First C# 中文版 第10章 异常处理 page449
- 5/28 继续hash
- Winforms:把长ToolTip显示为多行
- gg_ok.php源代码分析
- 如何从优秀的程序员成为伟大的程序员
- 笔记1
- Java操作Excel的一种方法
- 随记