Idisposable 是否在结构等堆栈项上被调用(不使用 "Using" 时)

Does Idisposable get called on stack items like struct (when not using "Using")

撇开在非引用类型上实现 IDisposable 是否是一个可怕的糟糕想法,当删除非引用 IDisposable 时,是否会调用 Dispose() 方法来自堆栈?

答案是:否,

仅仅创建一个位于堆栈上的结构不会导致 Dispose() 在超出范围时被调用。 (当然,class 也不会发生这种情况。)

Dispose() 仅在显式调用或通过 using.

隐式调用时才会被调用

但是,如果结构实现 IDisposable 并在 using 中使用,Dispose() 将被调用 ,如下所示:

using System;

namespace Demo
{
    struct Test: IDisposable
    {
        public void Dispose()
        {
            Console.WriteLine("Help! Help! I'm being oppressed!");
        }
    }
    static class Program
    {
        static void Main()
        {
            using (var test = new Test())
            {
                Console.WriteLine("Using a Test object");
            }
        }
    }
}

这输出

Using a Test object
Help! Help! I'm being oppressed!

请注意,结构通常是轻量级的,不应真正包含引用(字符串可能除外)。在那种情况下,一个结构中不应该有任何一次性的东西,所以不会出现这个问题。