C# 如何获取结构的更新大小?向动态数组字段添加值时,结构的大小未更新
这与我以前的想法有关,我认为这是一个简单的问题,因为它更有意义 我已将我的结构创建为:C# 如何获取结构的更新大小?向动态数组字段添加值时,结构的大小未更新,c#,.net,struct,structure,C#,.net,Struct,Structure,这与我以前的想法有关,我认为这是一个简单的问题,因为它更有意义 我已将我的结构创建为: public struct Smb_Parameters { public byte WordCount; public ushort[] Words; } 当我尝试获取结构的大小时,不指定任何值,它返回4字节: Smb_Parameters smbParameter = new Smb_Parameters(); int le
public struct Smb_Parameters
{
public byte WordCount;
public ushort[] Words;
}
当我尝试获取结构的大小时,不指定任何值,它返回4字节:
Smb_Parameters smbParameter = new Smb_Parameters();
int len1 = Marshal.SizeOf(smbParameter );
MessageBox.Show(len1.ToString());
但当我将值指定给结构字段时:
Smb_Parameters smbParameter = new Smb_Parameters();
string myString= "String ll be converted to byte";
smbParameter.WordCount=0x00;
smbParameter .Words=Encoding.ASCII.GetBytes(myString);
int len1 = Marshal.SizeOf(smbParameter );
MessageBox.Show(len1.ToString());
现在它仍然显示长度为4字节,但我需要更新的大小。单词字段是一个数组,数组是引用类型。该结构实际上并不包含数组项,它只包含对数组的引用,该数组存储在其他地方(通常在堆上)。因此
SizeOf
总是返回相同的大小,因为引用的大小并不取决于该引用所指向的对象的大小。如果希望将大小作为非托管类型,则需要提供有关其字段的一些信息(例如,数组的长度)。没有它,就不会考虑数组长度
e、 g
请注意,这些大小是固定的(就像是在C/C++程序中声明的一样)。SizeOf()
报告的大小将只使用这些值,而不考虑存储在Words
中的数组大小
Smb_Parameters1 s1 = new Smb_Parameters1() { Words = new ushort[] { 0, 1, 2 } };
Smb_Parameters2 s2 = new Smb_Parameters2() { Words = new ushort[] { 0, 1, 2 } };
Marshal.SizeOf(s1); //8 bytes
Marshal.SizeOf(s2); //22 bytes
Marshal.SizeOf()
返回类/结构的固定大小。长度永远不取决于所传递对象的内容
您可以使用Marshal.SizeOf(typeof(byte))+Marshal.SizeOf(typeof(ushort))*您的数组长度来计算大小
另一种方法是使用BinaryFormatter
类将结构序列化为二进制形式。它返回一个字节数组。如果计算它的长度,就知道它的序列化大小。请注意,BinaryFormatter的结果不易被非.net语言读取,因为其格式仅为.net本机格式。为什么要将字数设置为0?谢谢。是否有一种方法可以得到结构的实际大小。结构的实际大小正是Marshal.SizeOf。。。只是数组项不是结构的一部分,可能是因为我使用了Marshal.SizeOf(Smb_参数s1),所以得到了4;非封送处理大小(类型(Smb_参数1));我很确定,虽然它不是一个16位系统
Smb_Parameters1 s1 = new Smb_Parameters1() { Words = new ushort[] { 0, 1, 2 } };
Smb_Parameters2 s2 = new Smb_Parameters2() { Words = new ushort[] { 0, 1, 2 } };
Marshal.SizeOf(s1); //8 bytes
Marshal.SizeOf(s2); //22 bytes