A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Always. 于 2013-9-23 23:00 编辑

问题1:在C#中,close(),flush()以及dispose()这三种方法有什么区别 ?分别在什么情况情况下使用 ? (PS:求案例)问题2:为什么在数据导出的时候,使用using和flush是一样的效果。
使用using释放代码:
  1.             if (ofdOutput.ShowDialog() != DialogResult.OK)
  2.             {
  3.                 MessageBox.Show("导出失败");
  4.             }
  5.             string dataDir = AppDomain.CurrentDomain.BaseDirectory;
  6.             if (dataDir.EndsWith(@"\bin\Debug\")
  7.                 || dataDir.EndsWith(@"\bin\Release\"))
  8.             {
  9.                 dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
  10.                 AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
  11.             }
  12.             using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\我的第一个mdf解决\数据导出\Database6.mdf;Integrated Security=True;User Instance=True"))
  13.             {
  14.                 conn.Open();
  15.                 using (SqlCommand cmd = conn.CreateCommand())
  16.                 {
  17.                     cmd.CommandText = "select * from T_Persons";
  18.                     using (SqlDataReader reader = cmd.ExecuteReader())
  19.                     {
  20.                         using (FileStream filestream = new FileStream(ofdOutput.FileName, FileMode.Append, FileAccess.Write))
  21.                         {
  22.                             using (StreamWriter sw = new StreamWriter(filestream))
  23.                             {
  24.                                 while (reader.Read())                   //逐行读取每一个信息,比如第一行
  25.                                 {
  26.                                     string name = reader.GetString(reader.GetOrdinal("Name"));   //比如读取第一行中Name那里列中的内容
  27.                                     string age = reader.GetString(reader.GetOrdinal("Age"));      //比如读取第一行中Age那里列中的内容   
  28.                                     string line = name + "|" + age;
  29.                                     sw.WriteLine(line);
  30.                                 }
  31.                             }
  32.                         
  33.                         }
  34.                     }
  35.                     MessageBox.Show("导出成功");
  36.                 }
  37.             }
复制代码
使用 Flush()的代码(给出的是有区别的代码,未给出的代码跟上面是相同的):
  1.                         using (FileStream filestream = new FileStream(ofdOutput.FileName, FileMode.Append, FileAccess.Write))
  2.                         {
  3.                             StreamWriter sw = new StreamWriter(filestream);
  4.                            
  5.                                 while (reader.Read())                   //逐行读取每一个信息,比如第一行
  6.                                 {
  7.                                     string name = reader.GetString(reader.GetOrdinal("Name"));   //比如读取第一行中Name那里列中的内容
  8.                                     string age = reader.GetString(reader.GetOrdinal("Age"));      //比如读取第一行中Age那里列中的内容   
  9.                                     string line = name + "|" + age;
  10.                                     sw.WriteLine(line);
  11.                                 }

  12.                                 sw.Flush();
  13.                         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈行 + 1

查看全部评分

10 个回复

倒序浏览
Close()方法在这里就是关闭连接的意思啊,当我们使用完数据库或数据流的时候,就要用Close()方法把它们关闭,然后使用Dispose()方法进行释放,避免占用资源。但要注意,使用Close()方法仅仅只是关闭连接,资源并没有被释放。我们可以直接使用Dispose()方法,因为Dispose方法里面会判断当前连接是否关闭,如果没有关闭,就会调用Close()方法先关闭掉连接,然后再进行资源的释放。给你一张图片看看Dispose()方法吧,可能不太清晰。在using语句执行完毕之后,程序会自动调用Dispose()进行释放,不需要我们显式的调用Dispose()方法。至于Flush()方法用得少,不太明白。

Dispose方法.jpg (77 KB, 下载次数: 62)

Dispose方法.jpg
回复 使用道具 举报
leayon 发表于 2013-9-23 13:55
Close()方法在这里就是关闭连接的意思啊,当我们使用完数据库或数据流的时候,就要用Close()方法把它们关闭 ...

恩恩,这个明白了。
主要是什么情况下使用using进行资源释放,什么时候使用flush呢 ?这个不太晓得
回复 使用道具 举报
如果使用了Close()方法,就一定要使用Dispose()方法进行释放,而使用using可以避免这两步代码的书写,使用using创建出的读取流对象只能在using的范围内使用,超出范围就会被释放。它一般用于数据的读写操作(至少是我目前见过的使用地方,不知道是不是孤陋寡闻。。。)。至于Flush我不知道,没见过。
回复 使用道具 举报
记得把解决的帖子改成已解决啊~

评分

参与人数 1技术分 +5 收起 理由
黑马-吕老师 + 5 版主辛苦啦

查看全部评分

回复 使用道具 举报
dispose()是断开连接,之后不可以SqlCon.Open()
还需要重新实例化连接对象如: string StrCon = ConfigurationManager.AppSettings["cnnDB"];
        SqlConnection SqlCon = new SqlConnection(StrCon);
之后才能SqlCon.Open()

而close()是暂时关闭,之后可以直接SqlCon.Open(),不需要再实例化连接对象。

评分

参与人数 1技术分 +1 收起 理由
陈行 + 1 赞一个!

查看全部评分

回复 使用道具 举报
陈行 发表于 2013-9-23 20:50
记得把解决的帖子改成已解决啊~

问题木有解决啊,Flush()什么时候用,我还是不知道。
回复 使用道具 举报
我明白了,在此处的sw.Flush()是清空缓冲区,并把缓冲区的内容输出来。
回复 使用道具 举报
haxyek 金牌黑马 2013-9-23 22:52:11
9#
Always. 发表于 2013-9-23 22:45
我明白了,在此处的sw.Flush()是清空缓冲区,并把缓冲区的内容输出来。

对的,
为什么在数据导出的时候,使用using和flush是一样的效果。


这个可能是你的数据量不够。你试试把数据量放大试试。。

回复 使用道具 举报

数据量大的时候,使用Flush()较好!
回复 使用道具 举报
Always. 发表于 2013-9-23 23:00
数据量大的时候,使用Flush()较好!

是的,但是数据小的时候,看不出效果的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马