相关疑难解决方法(0)

垃圾收集器是否会为我调用IDisposable.Dispose?

.NET IDisposable Pattern 意味着如果您编写终结器并实现IDisposable,则终结器需要显式调用Dispose.这是合乎逻辑的,而且在极少数情况下我总是会做终结器的保证.

但是,如果我这样做会发生什么:

class Foo : IDisposable
{
     public void Dispose(){ CloseSomeHandle(); }
}
Run Code Online (Sandbox Code Playgroud)

并且不要实现终结器或任何东西.框架会为我调用Dispose方法吗?

是的,我意识到这听起来很愚蠢,而且所有的逻辑都暗示它不会,但我总是有两件事让我不确定.

  1. 几年前有人曾告诉我,事实上它会这样做,而且那个人有"非常了解他们的东西"的良好记录.

  2. 编译器/框架根据您实现的接口(例如:foreach,扩展方法,基于属性的序列化等)执行其他"神奇"操作,因此这也可能是"魔术".

虽然我已经阅读了很多关于它的内容,并且有很多暗示的内容,但我从来没有能够找到这个问题的肯定是或否答案.

.net dispose idisposable

126
推荐指数
5
解决办法
3万
查看次数

依赖于.NET自动垃圾收集器是不好的做法吗?

可以创建大量内存密集型对象,然后放弃对它们的引用.例如,我可能想要从数据库下载和操作一些数据,我将进行100次单独的下载和处理迭代.我可以声明一次DataTable变量,并且对于每个查询,使用构造函数将其重置为新的DataTable对象,从而放弃内存中的旧DataTable对象.

DataTable类具有简单的内置方式来释放它使用的内存,包括Rows.Clear()和.Dispose().因此,在将变量设置为新的DataTable对象之前,我可以在每次迭代结束时执行此操作.或者我可以忘掉它,让CLR垃圾收集器为我做这件事.垃圾收集器似乎非常有效,因此最终结果应该是相同的.当你不需要它们时,显然处理内存繁重的对象(但是添加代码来执行此操作)或者只是依靠垃圾收集器为你做所有的工作(你受到了摆布GC算法,但你的代码更小)?

根据要求,这里是代码说明了回收的DataTable变量示例:

    // queryList is list of 100 SELECT queries generated somewhere else.
    // Each of them returns a million rows with 10 columns.
    List<string> queryList = GetQueries(@"\\someserver\bunch-o-queries.txt");
    DataTable workingTable;

    using (OdbcConnection con = new OdbcConnection("a connection string")) {
        using (OdbcDataAdapter adpt = new OdbcDataAdapter("", con)) {
            foreach (string sql in queryList) {
                workingTable = new DataTable();  // A new table is created. Previous one is abandoned
                adpt.SelectCommand.CommandText = sql;
                adpt.Fill(workingTable);
                CalcRankingInfo(workingTable);
                PushResultsToAnotherDatabase(workingTable);
                // Here I could call workingTable.Dispose() …
Run Code Online (Sandbox Code Playgroud)

.net garbage-collection

5
推荐指数
2
解决办法
4817
查看次数

C#Dispose:处置时和处理它

我在处理和最终确定之间陷入了困境.这是我的示例代码:

public class Car:IDisposable
    {
        public string name;
        public Car()
        {
            name = "My Car";
        }
        public void Dispose()
        {
            Console.WriteLine("This object has been disposed");
        }
    }
public static void Main()
        {
            Car anotherCar;
            using (var car = new Car())
            {
                anotherCar = car;
                Console.WriteLine("Before dispose. Name is: "+anotherCar.name);
            }

            Console.WriteLine("After dispose. Name is: "+anotherCar.name);

        }
Run Code Online (Sandbox Code Playgroud)

结果是:

Before dispose. Name is My Car
This object has been disposed
After dispose. Name is My Car
Run Code Online (Sandbox Code Playgroud)

我的问题是:因为C#会在之后自动处理对象using{},所以我想在"After dispose"之后.anotherCar.name必须为NULL.为什么它仍然是"我的车"? …

c# dispose

2
推荐指数
1
解决办法
489
查看次数

标签 统计

.net ×2

dispose ×2

c# ×1

garbage-collection ×1

idisposable ×1