|
|
1
6
不应该有任何情况下您不想调用Dispose,但是编译器不能告诉您 哪里 假设您编写了一个工厂类,该类创建并返回一次性对象。当清理应该由调用方负责时,编译器是否应该因未调用Dispose而对您产生错误? |
|
|
2
4
IDisposable更多的是为了利用using关键字。它并不是为了强迫你调用Dispose()——而是为了让你能够以一种巧妙、不唐突的方式调用它:
|
|
|
3
3
好吧,如果一切顺利,CLR将在程序结束时调用所有对象的终结器,如果IDisposable模式得到正确实现,它将调用Dispose()方法。所以最后,一切都会被妥善清理。 问题是,如果您有一个长时间运行的程序,那么您的一些IDiposable实例很可能锁定了一些不应该锁定的资源。对于这种情况,用户代码应该在处理完对象后立即使用using块或调用Dispose(),但除了代码作者之外,任何人都无法知道这一点。 |
|
|
4
1
不需要调用Dispose方法。实现IDisposable接口是一个提醒,您的类可能正在使用诸如数据库连接、文件句柄等需要关闭的资源,因此GC还不够。
|
|
|
5
1
一个很好的例子是.NET2.0Ping类,它异步运行。除非它抛出异常,否则实际上直到回调方法才调用Dispose。请注意,由于Ping实现IDisposable接口的方式,这个示例有一些稍微奇怪的转换,但也继承了Dispose()(只有前者才能正常工作)。
|
|
|
6
1
有一些工具可以帮助跟踪这些,方法是对托管堆和堆栈进行快照,并允许您查看在给定的时间点上使用了哪些对象。免费赠品是windbg使用sos.dll;需要在google上搜索一些教程,才能向您显示所需的命令,但它是有效的,而且是免费的。一个更加用户友好(不要把它与“简单”混淆)的选项是redgate的ANTS Profiler,它运行在内存分析模式下——这是一个非常灵活的工具。 Edit:关于调用Dispose的有用性,它提供了一种确定的方法来清理对象。垃圾回收只在应用程序的分配内存用完时运行——这是一项昂贵的任务,它基本上会停止应用程序的执行,并查看现有的所有对象,然后生成“可访问”(正在使用)对象的树,然后清理不可访问的对象。在GC必须运行之前,手动清理对象将释放它。 |
|
|
7
0
|
|
|
8
0
|
|
|
9
0
老实说,我不确定是否存在能够检查是否调用了.Dispose()的静态分析器。即使是像现在这样的静态分析,也可能有点过于主观。但是,如果您需要一个开始查找的地方,“静态C#分析”可能是最好的地方。 |
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |