问个函数返回对象的的问题

zbking 2007-07-04 03:45:58
函数如下
public DataTable return_dt(string sql)
{
OleDbConnection con=new OleDbConnection(数据库链接字符)
try
{
con.Open();
}
catch (OleDbException err)
{ MessageBox.Show(err.Message); }
OleDbCommand cmd = con.CreateCommand();
cmd.CommandText = sql;//sql语句

try
{
dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));
}
catch (OleDbException err)
{
MessageBox.Show(err.Message + cmd.CommandText);
}

cmd.Dispose();
con.Close();
return (dt);

}

函数引用:
DataTable ab= return_dt(string sql);

现在在内存里是有2个DataTable,及函数处理有1个然后又赋值给了ab ,还是说只有1个DataTable 就是ab
...全文
504 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
amandag 2007-07-11
  • 打赏
  • 举报
回复
请问 return_dt 不是 return了一个 对象么 c#中对象不过是引用而已 简单的=赋值应该算是浅拷贝 我感觉就一个对象 如果不对忘指教一二 初学
=====================================
return的是一个对象的引用

如果你要认真探讨堆里有几个对象的话,我认为是两个(new DataTable();生成的和return_dt(string sql) 创建的),但new DataTable();由于已经没有任何引用指向它,所以随时会被回收
linekery 2007-07-05
  • 打赏
  • 举报
回复
我感觉就一个datatable实例


刚才说法不好 :)
顺便接分
linekery 2007-07-05
  • 打赏
  • 举报
回复
amandag(高歌) ( ) 信誉:100 Blog 加为好友 2007-07-05 12:15:39 得分: 0


DataTable ab= new DataTable();
ab = return_dt(string sql) ;
=========================
托管堆有两个DataTable
new DataTable();和 return_dt()函数返回的,
但new DataTable()由于在栈中没有引用了,很快会被回收,能用的就只有ab指向的这个return_dt(string sql) ;了



请问 return_dt 不是 return了一个 对象么 c#中对象不过是引用而已 简单的=赋值应该算是浅拷贝 我感觉就一个对象 如果不对忘指教一二 初学
setdefault 2007-07-05
  • 打赏
  • 举报
回复
两个说法差不多。
ab是一个引用,指向new DataTable();创建的表(假设地址A),
现在return_dt(string sql) ;返回得到新的表地址(假设B),ab指向了地址B。
那么分配在地址A的数据因为没有被引用,就无法使用了(找不到了),就会被当作垃圾回收。
amandag 2007-07-05
  • 打赏
  • 举报
回复
DataTable ab= new DataTable();
ab = return_dt(string sql) ;
=========================
托管堆有两个DataTable
new DataTable();和 return_dt()函数返回的,
但new DataTable()由于在栈中没有引用了,很快会被回收,能用的就只有ab指向的这个return_dt(string sql) ;了
xvting 2007-07-05
  • 打赏
  • 举报
回复
jjhlover(.net 2.0虚拟主机(idc.iweb365.com)测试三天) 对

ztenv 2007-07-05
  • 打赏
  • 举报
回复
楼主呀,好好看一下数据类型吧..然后就不用浪费宝贵的分了..
godgreat 2007-07-05
  • 打赏
  • 举报
回复
楼上的已经解释了
zbking 2007-07-05
  • 打赏
  • 举报
回复
那个说法对啊
zbking 2007-07-05
  • 打赏
  • 举报
回复
wxy0401(工蚁)
DataTable ab= new DataTable();
ab=return_dt(string sql) ;
这样内存中还是只有1吗?既ab指向的DataTable()是吗?
========================
是的,内存中只有一个,对引用类型的值赋值一般都是指针操作.


jjhlover(.net 2.0虚拟主机(idc.iweb365.com)测试三天)

如果是
DataTable ab= new DataTable();
ab=return_dt(string sql) ;
这样内存中还是只有1吗?既ab指向的DataTable()是吗?
----------------------------------------------------------

现在内存中两个,但有一个没有引用了,要回收了.



2个不一样的说法,谁对啊。。。。。
coolbyefish 2007-07-05
  • 打赏
  • 举报
回复
只有一个 datatable的实例 DataTable ab只是个引用
如果dt被清空释放 ab也就成了个空引用 空指针
MicroSoftor 2007-07-05
  • 打赏
  • 举报
回复
楼主如果要是明白这整个过程就会清楚内存中存在几个了
首先你定义了一个DataTable ab..
注意这句话并不会在内存中存在一个DATATABLE


在执行完方法调用后,系统中会出现一个DATATABLE,并将地址返回给 ab
此时系统中仍是一个DATATABLE

还有疑问??!
留下笑容 2007-07-05
  • 打赏
  • 举报
回复
你的过程里面的dt没有定义呀

DataTable dt;
return_dt(string sql);
???
是一个
wdxinren 2007-07-04
  • 打赏
  • 举报
回复
所以呢,按照楼上所说,应该写成这样
DataTable ab = null;
ab = return_dt(string sql);


变量名跟函数名真是取的完全不符合C#规范...
jjhlover 2007-07-04
  • 打赏
  • 举报
回复
如果是
DataTable ab= new DataTable();
ab=return_dt(string sql) ;
这样内存中还是只有1吗?既ab指向的DataTable()是吗?
----------------------------------------------------------

现在内存中两个,但有一个没有引用了,要回收了.
wxy0401 2007-07-04
  • 打赏
  • 举报
回复
DataTable ab= new DataTable();
ab=return_dt(string sql) ;
这样内存中还是只有1吗?既ab指向的DataTable()是吗?
========================
是的,内存中只有一个,对引用类型的值赋值一般都是指针操作.
2021‘someday 2007-07-04
  • 打赏
  • 举报
回复
只有一个,是引用赋值,相当于C++中的指针操作
zbking 2007-07-04
  • 打赏
  • 举报
回复
如果是
DataTable ab= new DataTable();
ab=return_dt(string sql) ;
这样内存中还是只有1吗?既ab指向的DataTable()是吗?
Pittypat 2007-07-04
  • 打赏
  • 举报
回复
只有一个,赋值仅仅是指针操作
yixianggao 2007-07-04
  • 打赏
  • 举报
回复
DataTable 是引用类型,因此内存里只有一个真正的 DataTable,

即 return_dt(string sql) 的返回值,

当然还有一个引用,即 ab!

解释完毕!
加载更多回复(1)

110,565

社区成员

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

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

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