.net释放资源

myhorsefsy 2009-12-14 01:02:04
.net释放资源的方法有那些呀?用idisposable接口怎么实现?什么时候可以使用idisposable接口去实现释放资源
...全文
235 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanele 2009-12-14
  • 打赏
  • 举报
回复
新手,进来学习一下!
辉太郎 2009-12-14
  • 打赏
  • 举报
回复
只见别人用过,自己还没考虑过,收藏了,学习一下
zjh333 2009-12-14
  • 打赏
  • 举报
回复
Net的资源是自动的,也就是微软的黑箱,网上大量的关于释放资源的文章,都是在作戏,
除了微软,没有人能人为控制Net的资源回收.
用VC++或Delphi就不错,一个Delete或Free就搞定
_autotest 2009-12-14
  • 打赏
  • 举报
回复
恩,楼上的说法偶用过,不错
SharpHook 2009-12-14
  • 打赏
  • 举报
回复
当你不再需要某个对象时可以将这个对象设置null
GC会自动回收这个对象,但GC的回收时间是不固定的
你也可以强制GC回收垃圾:GC.Collect();
wuzhicheng5 2009-12-14
  • 打赏
  • 举报
回复
c#最大的特点是有GC机制,所以只要是系统托管的资源,你可以不管它,GC会自动帮你在该释放的时候释放资源。
建议少用全局变量和全局静态变量。
ADO.NET的对象都是非托管的,所以得自己编码实现释放。

希望能个帮到你。
qqiuzaihui 2009-12-14
  • 打赏
  • 举报
回复
给你一段参考代码, 部分地方写了注释, 如何还不懂, 请自己去看 C#高级编程第四版 第309页:

using System;
using System.IO;

namespace Wrox.ProCSharp.AdvancedCSharp
{
class MainEntryPoint
{
static void Main()
{
string fileName;
Console.Write("Please type in the name of the file " +
"containing the names of the people to be cold-called > ");
fileName = Console.ReadLine();
ColdCallFileReader peopleToRing = new ColdCallFileReader();

try
{
peopleToRing.Open(fileName); // 打开文件
for (int i = 0; i < peopleToRing.NPeopleToRing; i++) // 循环处理文件中的所有人名
{
peopleToRing.ProcessNextPerson(); // 读取文件中的下一个人名
}
Console.WriteLine("All callees processed correctly");
}
catch (Exception e)
{
Console.WriteLine("Exception occurred:\n" + e.Message);
}
finally
{
peopleToRing.Dispose(); // 关闭已打开的文件
}
Console.ReadLine();
}
}

class ColdCallFileReader : IDisposable // 继承接口IDisposable, 确保正确释放对象
{
FileStream fs; // 专用于连接文件
StreamReader sr; // 专用于读取文本文件
uint nPeopleToRing;
bool isDisposed = false;
bool isOpen = false;

public void Open(string fileName)
{
if (isDisposed) // 检查在删除对象后, 客户机代码是否不正确地调用了它
throw new Exception("peopleToRing");

fs = new FileStream(fileName, FileMode.Open);
sr = new StreamReader(fs);

string firstLine = sr.ReadLine();
nPeopleToRing = uint.Parse(firstLine);
isOpen = true;
}
public uint NPeopleToRing // 返回文件中假定的人数
{
get
{
if (isDisposed)
throw new Exception("peopleToRing");
if (!isOpen)
throw new Exception("Attempt to access cold call file that is not open");
return nPeopleToRing;
}
}
public void Dispose() // 释放资源
{
if (isDisposed) return;

isDisposed = true;
isOpen = false;
if (fs != null)
{
fs.Close();
fs = null;
}
}
public void ProcessNextPerson()
{
if (isDisposed) throw new Exception("peopleToRing");
if (!isOpen) throw new Exception("Attempt to access cold call file that is not open");

string name;
name = sr.ReadLine();
if (name == null) // 如果到达文件末尾, 抛出异常
throw new Exception("Not enough names");
Console.WriteLine(name);
}
}
}
myhorsefsy 2009-12-14
  • 打赏
  • 举报
回复
楼上的高手,主要没写过这方面的代码呀。有没有可供参考的例子让我学习一下呀?
wuyq11 2009-12-14
  • 打赏
  • 举报
回复
GC的是.NET中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。
托管代码的堆上的垃圾内存可由GC自动回收,非托管代码中堆上的垃圾内存必须程序员自己负责释放、回收
wuyq11 2009-12-14
  • 打赏
  • 举报
回复
在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。
private bool _disposed = false;
public void Dispose()
{
Dispose(true);
}

private void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{

GC.SuppressFinalize(this);
}
_disposed = true;
}
}
xupeihuagudulei 2009-12-14
  • 打赏
  • 举报
回复
托管代码gc会自动帮你回收
自己写的就是实现你刚刚说的那个接口
再调用dispose()方法。
zjx311989 2009-12-14
  • 打赏
  • 举报
回复
帮你顶...

111,120

社区成员

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

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

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