如果DataSet、DataTable类型对象当做函数参数或者返回值,这样函数之间传递的是拷贝还是引用? 如题,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 作为参数传递没有特别制定ref就是拷贝,返回也是拷贝 引用拷贝因为他们都是从object继承的值类型才是传值 我认为是传拷贝(深拷贝)。例子:public DataTable SelectDataBase(string tempStrSQL){ this.myConnection = new SqlConnection(connectionString); DataSet tempDataSet = new DataSet(); this.da = new SqlDataAdapter(tempStrSQL,this.myConnection); this.da.Fill(tempDataSet); return tempDataSet.Tables[0];}如果是传引用,那么上例中就有问题,tempDataSet是临时DataSet对象,函数运行结束就无效了 楼上理解有误tempDataSet并没有被GC回收因为GC探测到它还会被使用也就是应用程序根指向了它我也说不太清楚,可以看看《.net框架程序设计》的gc相关章节 chengbo1983:你说的对,我又写代码测试了一遍,证明确实是传引用private void Form1_Load(object sender, System.EventArgs e){ DataTable qwert = new DataTable(); qwert = QWERT("Select * From Customers"); //this.dataGrid1.DataSource = qwert;//可以去除注释测试 DataTable asdfg = new DataTable(); asdfg = qwert; //asdfg = qwert.Copy();//和上一行切换进行测试 this.dataGrid2.DataSource = asdfg;}private DataTable QWERT(string strCon){ SqlConnection myConnection = new SqlConnection("packet size=4096;integrated security=SSPI;data source=localhost;persist security info=False;initial catalog=Northwind"); DataSet tempDataSet = new DataSet(); SqlDataAdapter da = new SqlDataAdapter(strCon,myConnection); da.Fill(tempDataSet); this.dataGrid1.DataSource = tempDataSet.Tables[0];//注意此行 return tempDataSet.Tables[0];}测试结果是,如果注释掉这一行asdfg = qwert.Copy();那么对dataGrid1、dataGrid2的新增、修改操作是同步的,即它们数据源是一个。看来,.Net的编程方式和以前有了颠覆性的改变(可以传临时变量的引用),我还要学很多基础性的知识。 如何使用C#的用户控件创建ActiveX 供VC程序调用???? 求教下,大家现在都用什么工作流? 求助?三维坐标 新手小问 ==========System.Windows.Forms.ListBox简单问题 如何得到DataGrid中某一列的ReadOnly属性? 数据库的读取和写入 如何使用WPF制作好看的控件和界面呢? 求一条SQL语句,将一个字段显示成两列 如何打印出RichTextBox中的内容? 所见即所得? Microsoft Visual Studio 2005中使用multipage奇怪的问题 如何实现打印winform的工作区?
因为他们都是从object继承的值类型才是传值
public DataTable SelectDataBase(string tempStrSQL)
{
this.myConnection = new SqlConnection(connectionString);
DataSet tempDataSet = new DataSet();
this.da = new SqlDataAdapter(tempStrSQL,this.myConnection);
this.da.Fill(tempDataSet);
return tempDataSet.Tables[0];
}
如果是传引用,那么上例中就有问题,tempDataSet是临时DataSet对象,函数运行结束就无效了
tempDataSet并没有被GC回收
因为GC探测到它还会被使用
也就是应用程序根指向了它我也说不太清楚,可以看看《.net框架程序设计》的gc相关章节
private void Form1_Load(object sender, System.EventArgs e)
{
DataTable qwert = new DataTable();
qwert = QWERT("Select * From Customers");
//this.dataGrid1.DataSource = qwert;//可以去除注释测试 DataTable asdfg = new DataTable();
asdfg = qwert;
//asdfg = qwert.Copy();//和上一行切换进行测试
this.dataGrid2.DataSource = asdfg;
}
private DataTable QWERT(string strCon)
{
SqlConnection myConnection = new SqlConnection("packet size=4096;integrated security=SSPI;data source=localhost;persist security info=False;initial catalog=Northwind");
DataSet tempDataSet = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(strCon,myConnection);
da.Fill(tempDataSet);
this.dataGrid1.DataSource = tempDataSet.Tables[0];//注意此行
return tempDataSet.Tables[0];
}
测试结果是,如果注释掉这一行asdfg = qwert.Copy();那么对dataGrid1、dataGrid2的新增、修改操作是同步的,即它们数据源是一个。看来,.Net的编程方式和以前有了颠覆性的改变(可以传临时变量的引用),我还要学很多基础性的知识。