函数如下
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

解决方案 »

  1.   

    DataTable 是引用类型,因此内存里只有一个真正的 DataTable,即 return_dt(string sql) 的返回值,当然还有一个引用,即 ab!解释完毕!
      

  2.   

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

  3.   

    DataTable  ab= new DataTable();
    ab=return_dt(string sql) ;
    这样内存中还是只有1吗?既ab指向的DataTable()是吗?
    ========================
    是的,内存中只有一个,对引用类型的值赋值一般都是指针操作.
      

  4.   

    如果是
    DataTable  ab= new DataTable();
    ab=return_dt(string sql) ;
    这样内存中还是只有1吗?既ab指向的DataTable()是吗?
    ----------------------------------------------------------现在内存中两个,但有一个没有引用了,要回收了.
      

  5.   

    所以呢,按照楼上所说,应该写成这样
    DataTable ab = null;
    ab = return_dt(string sql);
    变量名跟函数名真是取的完全不符合C#规范...
      

  6.   

    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个不一样的说法,谁对啊。。
      

  7.   

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

  8.   

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

  9.   

    两个说法差不多。
    ab是一个引用,指向new DataTable();创建的表(假设地址A),
    现在return_dt(string sql) ;返回得到新的表地址(假设B),ab指向了地址B。
    那么分配在地址A的数据因为没有被引用,就无法使用了(找不到了),就会被当作垃圾回收。
      

  10.   

    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#中对象不过是引用而已 简单的=赋值应该算是浅拷贝  我感觉就一个对象 如果不对忘指教一二  初学
      

  11.   

    我感觉就一个datatable实例  
    刚才说法不好  :)
    顺便接分
      

  12.   

    你的过程里面的dt没有定义呀DataTable  dt;
     return_dt(string sql);
    ???
    是一个
      

  13.   

    楼主如果要是明白这整个过程就会清楚内存中存在几个了
    首先你定义了一个DataTable  ab..
    注意这句话并不会在内存中存在一个DATATABLE
    在执行完方法调用后,系统中会出现一个DATATABLE,并将地址返回给 ab
    此时系统中仍是一个DATATABLE还有疑问??!
      

  14.   

    只有一个 datatable的实例 DataTable  ab只是个引用
    如果dt被清空释放 ab也就成了个空引用 空指针
      

  15.   

    请问 return_dt 不是 return了一个 对象么  c#中对象不过是引用而已 简单的=赋值应该算是浅拷贝  我感觉就一个对象 如果不对忘指教一二  初学
    =====================================
    return的是一个对象的引用如果你要认真探讨堆里有几个对象的话,我认为是两个(new DataTable();生成的和return_dt(string sql) 创建的),但new DataTable();由于已经没有任何引用指向它,所以随时会被回收