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!
请注意,结构通常是轻量级的,不应真正包含引用(字符串可能除外)。在那种情况下,一个结构中不应该有任何一次性的东西,所以不会出现这个问题。
撇开在非引用类型上实现 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!
请注意,结构通常是轻量级的,不应真正包含引用(字符串可能除外)。在那种情况下,一个结构中不应该有任何一次性的东西,所以不会出现这个问题。