2015-02-19 5 views
2

Тренировка с помощью некоторого низкоуровневого кода, я наткнулся на интерфейс .Net IBuffer. Этот интерфейс объявляет только два свойства - Length и Capacity.Что такое IBuffer?

Вопросы:

  • Что это интерфейс?
  • Поскольку только Length и Capacity выставлены, как можно получить доступ к фактическим данным?
+0

Это буфер ... Он может быть использован для буферизации при чтении файла ... https://msdn.microsoft.com/en-us/library/windows.storage.fileio.readbufferasync.aspx ? cs-save-lang = 1 & cs-lang = csharp # code-snippet-1 – rducom

+0

Похоже, что реализация непрозрачна, вы всегда будете получать доступ через объект чтения или записи, как показано в ссылке Sharped. –

+1

Это не тип .NET, он принадлежит WinRT. Апи, которую вы используете, когда пишете приложение для Windows Store или телефона. Вы получаете доступ к данным в буфере с классом DataReader. Какие трюки сильно похожи на класс .NET BinaryReader. –

ответ

2

Из MSDN:

При реализации интерфейса IBuffer, вы должны реализовать интерфейс IBufferByteAccess, который является COM-интерфейсом для доступа к буферу непосредственно

Так, чтобы ответить на ваш второй вопрос о доступе к данным берется за реализацию интерфейса IBufferByteAccess.

Как использовать случаи MSDN говорит:

Интерфейс IBuffer используется интерфейсами IInputStream и IOutputStream.

Вы можете найти более here

2

1) Интерфейс IBuffer используется для передачи буферов вокруг. Объект IBuffer представляет собой массив байтов.

Интерфейс не дает доступа к байтам буфера. Причина этого заключается в том, что типы WinRT не могут выражать указатели в своих метаданных, поскольку указатели плохо отображают некоторые языки (например, JavaScript или безопасный код C#). Интерфейс может предложить метод доступа к отдельным байтам в буфере, но вызов метода для получения каждого байта слишком сильно повредит производительности.

2) Внутренне CLR может взять объект IBuffer, запрос для его IBufferByteAccess интерфейса , а затем запросить свойство Buffer, чтобы получить небезопасный указатель на байты, содержащихся в буфере. С помощью указателя к байтам можно получить доступ напрямую.

internal interface IBufferByteAccess { 
    unsafe Byte* Buffer { get; } 
} 
Смежные вопросы