我正在阅读.net框架源代码: https://referencesource.microsoft.com
我发现BCL包含两个完全相同的类:SafeWaitHandle
& SafeFileHandle
。它们都有完全相同的代码!
来自参考资料来源(SafeFileHandle):
[System.Security.SecurityCritical] // auto-generated_required
public sealed class SafeFileHandle: SafeHandleZeroOrMinusOneIsInvalid {
private SafeFileHandle() : base(true)
{
}
public SafeFileHandle(IntPtr preexistingHandle, bool ownsHandle) : base(ownsHandle) {
SetHandle(preexistingHandle);
}
[System.Security.SecurityCritical]
[ResourceExposure(ResourceScope.Machine)]
[ResourceConsumption(ResourceScope.Machine)]
override protected bool ReleaseHandle()
{
return Win32Native.CloseHandle(handle);
}
}
来自参考资料来源(SafeWaitHandle):
[System.Security.SecurityCritical] // auto-generated_required
public sealed class SafeWaitHandle : SafeHandleZeroOrMinusOneIsInvalid
{
// Called by P/Invoke marshaler
private SafeWaitHandle() : base(true)
{
}
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public SafeWaitHandle(IntPtr existingHandle, bool ownsHandle) : base(ownsHandle)
{
SetHandle(existingHandle);
}
[System.Security.SecurityCritical]
[ResourceExposure(ResourceScope.Machine)]
[ResourceConsumption(ResourceScope.Machine)]
override protected bool ReleaseHandle()
{
return Win32Native.CloseHandle(handle);
}
}
我看到构造函数对IntPtr
参数有不同的名称,并且对SafeWaitHandle的评论试图告诉我一些事情。但我无法理解,因为代码是平等的,并且我理解这些类应该提供相同的行为。
有人知道为什么微软家伙创造了这些等于类吗?为什么我更喜欢一个班级到另一个班级?在什么情况下?
答案 0 :(得分:1)
差异是语义。大多数句柄都是相似的 - 只是一些资源的引用(通常只是一个指针)。但是,区分它们很有用。如果你有一些api接受SafeFileHandle
- 它将不接受SafeWaitHandle
(或其他类型的句柄存在),这可能会阻止一些微妙的错误。如果它接受了一些抽象Handle
- 那么有人可以传递任何句柄,不代表对文件的引用。所以不同类型的句柄由不同的类表示(即使具有相同的实现)+ C#类型的安全性有利于防止传递另一种类型句柄的一种类型的句柄。