我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
存在,与现在已经过时的接受IntPtr
do的重载的原因相同:这样,您就可以FileStream
从通过p / invoke interop(即从非托管代码)获得的文件句柄构造一个新实例。
SafeHandle
.NET的最早版本中没有使用的类型和惯用语。IntPtr
任何需要处理本地句柄的托管代码都可以使用原始值。SafeHandle
引入更好的类型时,为常用的本机句柄类型(例如文件句柄)提供特定的子类,然后在任何托管API中支持那些特定的子类,包括诸如for的构造函数的FileStream
地方,就很有意义了。使用以前的类型。
您提供的示例永远不会(或至少永远不会)出现在现实世界的代码中。如果要从托管代码中打开文件并仅在托管代码中使用它,则只需执行此操作。您根本不需要任何理由来破坏本机文件句柄。仅当需要将本机文件句柄传递给非托管代码时,才使用对象的SafeFileHandle
属性;FileStream
仅当您无法从非托管代码中获取该特定文件句柄时,才将SafeFileHandle
值传递给FileStream
构造函数。
坦白说,我不太了解您对绳索和孩子的类比。不过,这对我来说似乎并不正确或无用。您已经对先前的非常广泛的问题有了答案,什么是C#中的SafeFileHandle?何时应使用?,因此您应该已经知道为什么SafeFileHandle
存在,但在这里进行回顾:
SafeHandle
,以及它的子类,提供了一种更好的选择,而不是使自己的类与终结器一起处理。在SafeHandle
类本身实现了终结的逻辑,这样你的类没有这样做。至少,只要您的类通常可以处理的唯一非托管对象可以包装在一个SafeHandle
子类中,并且由于您可以实现自己的包装器,对于那些没有.NET提供的包装器的对象,这应该成为所有非托管对象-则不需要终结器。(您仍然需要实现IDisposable
,以便可以确定性地清理非托管对象……终结器仅作为备份存在)。我希望以上内容足以解释所有这一切。对于概念的广泛的,教程级的解释,堆栈溢出实际上并不是正确的地方。但是,假设上面的简短讨论提供了您需要了解这些构造函数为何存在的详细程度,这对我来说似乎很好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句