将 SafeFileHandle 与 FileStream 构造函数一起使用有什么好处

Are there any benefits for using SafeFileHandle with FileStream constructor

我读了很多关于 SafeFileHandle 的文章,从我所看到的来看,我认为我不必使用它,或者在 FileStream 中使用它没有任何好处,因为它由处理它的文件流的第一个 object 关闭,我不能在另一个 object 中使用它。

谁能告诉我应该什么时候使用它?

static void Main(string[] args)
{

    string path = "Hello";

    SafeFileHandle handle = File.Open(path, FileMode.OpenOrCreate).SafeFileHandle;

    using (FileStream fs = new FileStream(handle, FileAccess.ReadWrite))
    {
        // do work
    }
        Console.ReadKey();
}

据我所见,SafeFileHandle的定义是:就像一个人一只手握着一根绳子,他们在玩children,每child 握住绳子的秒针

person = 文件句柄或任何句柄(网络连接或任何)

绳子=SafeFileHandle

孩子 = object 想要使用 FileStream

这样的文件句柄进行操作

这是我对安全文件句柄的看法,是否正确?

接受 SafeFileHandle 的重载存在的原因与接受 IntPtr 的 now-obsolete 重载存在的原因相同:这样你就可以构造一个新的 FileStream 实例来自您通过 p/invoke 互操作获得的文件句柄,即来自非托管代码。

SafeHandle 类型及其使用的习语在 .NET 的最早版本中并不存在。原始 IntPtr 值用于处理本机句柄所需的任何时间托管代码。当引入更好的 SafeHandle 类型时,为 commonly-used 本机句柄类型(如文件句柄)提供特定的 subclasses,然后支持这些特定的 subclass在任何托管 API 中,包括像 FileStream 的构造函数,其中以前使用了本机句柄类型。

您提供的示例绝不会(或至少,不应)出现在 real-world 代码中。如果您从托管代码打开文件并仅在托管代码中使用它,那么您就可以这样做。您根本没有任何理由去弄乱本机文件句柄。只有当您需要将本机文件句柄传递给非托管代码时,您才可以使用 FileStream 属性 的 SafeFileHandle 属性,并且您会传递 SafeFileHandle仅当您无法从非托管代码中获取该特定文件句柄时才向 FileStream 构造函数赋值。

说实话,我不是很理解你用绳子和children做的类比。虽然它对我来说似乎不正确或有用。您已经对之前的非常宽泛的问题 有了答案,因此您应该已经知道 SafeFileHandle 存在的原因,但在此回顾一下:

  • SafeHandle 及其子 class 是作为必须 class 处理终结器的 much-better 替代方法提供的。 SafeHandle class 本身实现了终结逻辑,所以你的 class 没有做。至少,只要您的 class 通常处理的唯一非托管 object 可以包装在 SafeHandle 子 class 中 — 并且因为您可以实现自己的包装器,对于那些还没有 .NET-provided 包装器的 objects,这应该是非托管 objects 的 all — 然后你不需要终结器。 (您仍然需要实施 IDisposable,以便您的非托管 object 可以确定性地清理……终结器仅作为备份存在)。

我希望以上足以说明这一切。 Stack Overflow 并不是对概念进行广泛的教程级别解释的正确场所。但是,假设上面的简短讨论提供了您理解为什么存在这些构造函数所需的详细程度,这对我来说似乎很好。