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 和 HandleRef - 解释
无法将 ReleaseHandle 中的 SafeHandle 实例传递给本机方法