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

问题描述 投票:0回答:1

我阅读了很多有关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的定义是:就像一个人握着一根绳子的手,他们正在和孩子一起玩,而每个孩子握着绳子的另一只手。

人=文件句柄或任何句柄(网络连接或其他)

绳索= SafeFileHandle

孩子=想要使用文件句柄进行操作的对象,例如FileStream

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

c# handle safefilehandle
1个回答
1
投票

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

SafeHandle类型及其惯用语在.NET的最早版本中不存在。原始IntPtr值可用于处理本机句柄所需的任何托管代码。当引入更好的SafeHandle类型时,为常用的本机句柄类型(例如文件句柄)提供特定的子类,然后在任何托管API中支持那些特定的子类,包括像[C0 ],以前使用的是本地句柄类型。

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

坦白说,我不太了解您对绳索和孩子的类比。不过,这对我来说似乎并不正确或无用。您已经获得了先前非常广泛的问题FileStream的答案,因此您应该已经知道What is SafeFileHandle in c# and when should i use?存在的原因,但请在此处进行总结:

  • SafeFileHandle及其子类,是提供更好的替代方法,而不必让类与终结器一起使用。 SafeHandle类本身实现了终结处理逻辑,因此您的类没有这样做。至少,只要您的类通常可以处理的唯一非托管对象可以包装在SafeHandle子类中,并且因为您可以实现自己的包装器,所以对于那些没有.NET提供的包装器的对象,这应该是非托管对象的[[all-则不需要终结器。 (您仍然需要实现SafeHandle,以便可以确定性地清理非托管对象……终结器仅作为备份存在。)
我希望以上内容足以解释所有这一切。对于概念的大量教程级解释,Stack Overflow并不是真正的正确选择。但是,假设上面的简短讨论提供了您需要了解这些构造函数为何存在的详细程度,这对我来说似乎很好。
© www.soinside.com 2019 - 2024. All rights reserved.