SafeWaitHandle与SafeFileHandle c#

时间:2017-11-12 18:24:56

标签: c# .net base-class-library

我正在阅读.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的评论试图告诉我一些事情。但我无法理解,因为代码是平等的,并且我理解这些类应该提供相同的行为。

有人知道为什么微软家伙创造了这些等于类吗?为什么我更喜欢一个班级到另一个班级?在什么情况下?

1 个答案:

答案 0 :(得分:1)

差异是语义。大多数句柄都是相似的 - 只是一些资源的引用(通常只是一个指针)。但是,区分它们很有用。如果你有一些api接受SafeFileHandle - 它将不接受SafeWaitHandle(或其他类型的句柄存在),这可能会阻止一些微妙的错误。如果它接受了一些抽象Handle - 那么有人可以传递任何句柄,不代表对文件的引用。所以不同类型的句柄由不同的类表示(即使具有相同的实现)+ C#类型的安全性有利于防止传递另一种类型句柄的一种类型的句柄。