SafeHandle 中 invalidHandleValue 的作用是啥?

Posted

技术标签:

【中文标题】SafeHandle 中 invalidHandleValue 的作用是啥?【英文标题】:What's the purpose of invalidHandleValue in SafeHandle?SafeHandle 中 invalidHandleValue 的作用是什么? 【发布时间】:2013-07-15 00:35:34 【问题描述】:

The SafeHandle constructor 采用invalidHandleValue。如果你无论如何都必须实现IsInvalid,它有什么用因为它不知道哪个成员变量持有指针 [我不知道它为你实现了handle成员变量]?

【问题讨论】:

【参考方案1】:

在DotPeek中查看,发现它只是用来初始化protected IntPtr handle成员变量。

protected SafeHandle(IntPtr invalidHandleValue, bool ownsHandle)

  this.handle = invalidHandleValue;
  ...

我会说这个逻辑是这样的:

他们想要保证 handle 成员变量被初始化为某个东西,所以他们让你传递无效值。 您可能希望在 IsInvalid 中测试其他逻辑,因此它们不会费心提供默认实现(这也需要将传递的 invalidHandleValue 保存在 ctor 中。)

【讨论】:

哦...我什至不知道它正在为我实施一个this.handle 成员。我想我应该使用它而不是我自己的 :-) 现在这更有意义了!【参考方案2】:

当您调用new SafeHandleDerivedClass() 时,它是handle 的默认值(派生类可以在构造函数中调用base.SetHandle(someValue),但在调用之前,该值将是传入基类构造函数的任何值) .

【讨论】:

我不确定SetHandleAsInvalid 如何handle 设置回该值,因为它永远不会保存在ctor 中的任何位置。 您是否查看过 DotPeek 中 SetHandleAsInvalid 的代码?这只是对本机代码的调用,谁知道它是否在this.handle 之外存储了一个值。它工作的唯一两种方法是拦截对IsInvalid 的任何调用并代表它返回false,或者将this.handle 设置为已知的无效值。 对,但构造函数必须保存您传递的invalidHandleValue(它没有)。不过我现在很好奇,它是如何实现的。 MSDN: "只有当您知道您的句柄不再引用资源时才调用 SetHandleAsInvalid 方法。这样做不会更改句柄字段的值;它只会将句柄标记为关闭。然后句柄可能包含一个潜在的陈旧值。此调用的效果是不会尝试释放资源。" 感谢您让我对此进行研究 - 我从来没有为 SafeHandle 内部结构而烦恼。

以上是关于SafeHandle 中 invalidHandleValue 的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

哪些“IntPtr”风格是“SafeHandle”的候选者

IntPtr、SafeHandle 和 HandleRef - 解释

无法将 ReleaseHandle 中的 SafeHandle 实例传递给本机方法

safehandle 和析构函数

错误:ZLibStreamHandle 类型的 SafeHandle 或 CriticalHandle 未能正确释放

在 F# 中使用 SafeHandles