【问题标题】:Are there any benefits for using SafeFileHandle with FileStream constructor将 SafeFileHandle 与 FileStream 构造函数一起使用有什么好处吗
【发布时间】:2019-10-27 02:30:55
【问题描述】:

我阅读了很多关于SafeFileHandle 的内容,据我所见,我认为我不必使用它,或者在FileStream 中使用它没有任何好处,因为它被第一个对象关闭的文件流处理了它,我不能在其他对象中使用它。

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

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 的定义是:就像一个人握着一根绳子,他们在和孩子们玩耍,每个孩子都握着另一只手。

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

绳子 = SafeFileHandle

kids = 想要使用 FileStream 等文件句柄进行操作的对象

这是我对安全文件句柄的看法,对吗?

【问题讨论】:

  • SafeFileHandle 的重点是与本机非托管代码一起使用,例如 CreateFile 方法。除非您有充分的理由使用它,否则您可能不应该使用它。
  • @AhmedAbdelhameed 好的兄弟,但你能告诉我什么是原生非托管代码吗?

标签: c# handle safefilehandle


【解决方案1】:

接受SafeFileHandle 的重载存在的原因与接受IntPtr 的现已过时的重载相同:因此您可以从通过p/ 获得的文件句柄构造一个新的FileStream 实例调用互操作,即从非托管代码中调用。

SafeHandle 类型和使用它的惯用语在 .NET 的最早版本中不存在。原始IntPtr 值用于任何需要处理本机句柄的托管代码。当引入了更好的 SafeHandle 类型时,为常用的本机句柄类型(如文件句柄)提供特定的子类,然后在任何托管 API 中支持这些特定的子类,包括像 @987654328 这样的构造函数,这很有意义@,之前使用了本机句柄类型。

您提供的示例永远不会(或至少不应该)出现在实际代码中。如果您从托管代码打开文件并仅在托管代码中使用它,那么您只需执行此操作。您根本没有任何理由弄乱本机文件句柄。仅当您需要将本机文件句柄传递给非托管代码时,您才会使用 FileStream 对象的 SafeFileHandle 属性,并且仅当您无法将 SafeFileHandle 值传递给 FileStream 构造函数时获取特定文件句柄,非托管代码除外。

坦率地说,我真的不明白你用绳子和孩子做的比喻。不过,这对我来说似乎并不正确或有用。您已经得到了之前非常广泛的问题What is SafeFileHandle in c# and when should i use? 的答案,所以您应该已经知道为什么存在SafeFileHandle,但在这里回顾一下:

  • SafeHandle 及其子类被提供为一个更好的替代方案,而不是让一个类处理终结器。 SafeHandle 类本身实现了终结逻辑,所以你的类没有做。至少,只要您的类通常处理的唯一非托管对象可以包装在 SafeHandle 子类中 - 并且由于您可以实现自己的包装器,对于那些还没有 .NET 提供的包装器的对象,这应该是所有非托管对象的所有——那么你就不需要终结器了。 (您仍然需要实现 IDisposable,以便可以确定地清理您的非托管对象……终结器仅作为备份存在)。

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

【讨论】:

    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2016-12-19
    • 1970-01-01
    • 2023-03-21
    • 2010-09-10
    相关资源
    最近更新 更多