我在尝试修改一些低级代码时,偶然发现了 .Net 的 IBuffer
接口。该接口仅声明了两个属性 - Length
和 Capacity
。
问题:
- 这个接口是用来做什么的?
- 由于只有
Length
和Capacity
被公开,被调用者如何访问实际数据?
我在尝试修改一些低级代码时,偶然发现了 .Net 的 IBuffer
接口。该接口仅声明了两个属性 - Length
和 Capacity
。
问题:
Length
和 Capacity
被公开,被调用者如何访问实际数据?来自MSDN:
当您实现IBuffer接口时,必须实现IBufferByteAccess接口,该接口是用于直接访问缓冲区的COM接口。
因此,回答您的第二个问题是,通过实现IBufferByteAccess接口来处理数据访问。
至于用例,MSDN说:
IBuffer接口由IInputStream和IOutputStream接口使用。
您可以在此处找到更多信息。
1) IBuffer接口用于传递缓冲区。IBuffer对象表示一个字节数组。
该接口没有提供访问缓冲区字节的方法。原因是WinRT类型不能在元数据中表达指针,因为指针对某些语言(如JavaScript或安全的C#代码)不易映射。虽然该接口可以提供一种访问缓冲区中单个字节的方法,但每次调用方法获取字节会严重影响性能。
2) 在内部,CLR可以获取IBuffer对象并查询其IBufferByteAccess接口,然后查询Buffer属性以获取缓冲区中包含的字节的不安全指针。有了指针,就可以直接访问字节。
internal interface IBufferByteAccess {
unsafe Byte* Buffer { get; }
}