#c# #vb.net
#c# #vb.net
Вопрос:
VB:
Structure WAVEFORMATEX
Dim FormatTag As Short
Dim Channels As Short
Dim SamplesPerSec As Integer
Dim AvgBytesPerSec As Integer
Dim BlockAlign As Short
Dim BitsPerSample As Short
Dim Size As Short
End Structure
C#:
struct WAVEFORMATEX
{
public short FormatTag;
public short Channels;
public int SamplesPerSec;
public int AvgBytesPerSec;
public short BlockAlign;
public short BitsPerSample;
public short Size;
}
VB Len() возвращает 18. C # System.Runtime.Службы взаимодействия.Marshal.SizeOf() возвращает 20. Есть идеи, почему?
Комментарии:
1. это потому, что Marshal.SizeOf() возвращает точный размер выравнивания в 4 байта (для сортировки типов в неуправляемый код). Последнее сокращение в структуре дополняется до кратного 4 байтам для маршалинга (предполагается, что вы компилируете для целевого 32-разрядного)
2. @MitchWheat молодец, что понял точную разницу. Не стесняйтесь редактировать его в моем ответе.
Ответ №1:
Документы о Strings.Len
состоянии:
Если an
Object
содержит какой-либо другой тип, он вернет размер объекта, поскольку он будет записан в файлFilePut
функцией.
При этом используется довольно сжатый формат.
Тогда Marshal.SizeOf
как используется для вычисления размера для взаимодействия, например Marshal.StructureToPtr
, с . Это часто может дополнять небольшие значения до 32 или 64 бит, увеличивая размер.
Итак, алгоритм отличается, потому что конечная цель отличается.
Комментарии:
1. Можете ли вы порекомендовать более близкий эквивалент в C # для того, что Len() делает в VB?
2. Нет, потому
FilePut
что это не то, что имеет какой-либо эквивалент в C #. Вы все равно можете вызватьLen
иFilePut
, добавивMicrosoft.VisualBasic
в качестве ссылки.