Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取结构的更新大小?向动态数组字段添加值时,结构的大小未更新_C#_.net_Struct_Structure - Fatal编程技术网

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