草庐IT

c# - 如何在 C# Unity 中使用带有二维数组的 C 结构

所以我有一个具有以下结构的CAPItypedefstructmat4f_{floatm[4][4];}mat4f;它作为参数传递给我的一个API函数:voidmyFunction(constmat4fmatrix);我正在使用dll将此函数导出到Unity中的C#:[DllImport("mylib")]privatestaticexternvoidmyFunction(mat4fmatrix);我的问题是,我应该将相应的C#结构设为什么?现在我有以下内容:[StructLayout(LayoutKind.Sequential)]publicstructmat4f{publicfloa

c# - 在显式结构中将多个 CLR 引用字段相互重叠?

编辑:我很清楚这对值类型非常有效,我的具体问题是关于将它用于引用类型。Edit2:我还知道您不能在结构中叠加引用类型和值类型,这仅适用于将多个引用类型字段相互叠加的情况。我一直在研究.NET/C#中的结构,我刚刚发现您可以这样做:usingSystem;usingSystem.Runtime.InteropServices;namespaceConsoleApplication1{classFoo{}classBar{}[StructLayout(LayoutKind.Explicit)]structOverlaid{[FieldOffset(0)]publicobjectAsObje

C#。结构方法代码保存在内存中的什么地方?

众所周知,.NET将值类型保存在内存中(大部分在堆栈中,但在某些情况下也可能在堆中等)...我的问题是-结构的代码在哪里?如果我在结构中说出16字节的数据字段和其中的大量计算方法-我假设16字节将被复制到堆栈中并且方法代码存储在其他地方并为所有实例共享结构。这些假设是否正确? 最佳答案 MSIL存储在程序集的代码部分中-Windows在首次加载程序集时将其映射到内存中。首次执行该方法时,JIT会将MSIL编译为x86/x64代码。一旦该方法被编译到内存中,它通常会留在那里并由所有线程共享。在某些情况下,多个AppDomain会导致M

c# - 从 using 语句中修改值类型是未定义的行为吗?

这个真的是thisquestion的一个分支,但我认为它应该得到自己的答案。根据ECMA-334的第15.13节(关于using语句,以下称为resource-acquisition):Localvariablesdeclaredinaresource-acquisitionareread-only,andshallincludeaninitializer.Acompile-timeerroroccursiftheembeddedstatementattemptstomodifytheselocalvariables(viaassignmentorthe++and--operators

c# - 包含 guid 的结构上的 Marshal.SizeOf 提供额外的字节

我有几个具有顺序布局的结构:structS1{Guidid;}structS2{Guidid;shorts;}structS3{Guidid;shorts;shortt;}在上述结构类型上调用Marshal.SizeOf,我得到了:Size:S1=16,asexpected.S2=20,copiedaninstancetoabytearray,itonlyoccupiesfirst18bytes.S3=20.我的问题是,为什么S2的大小是20而不是18。只有当Guid在结构中时才会出现这个问题。很抱歉无法从msdn中找到任何有用的信息。我知道Marshal.SizeOf给出了该类型在内

c# - byte[] array to struct with variable length 数组

我正在从套接字接收一个字节数组,字节的结构只是一个固定宽度字符串的大字符数组。在某些情况下,最后一个字段是动态的(而不是固定长度),我正在尝试将字节编码为结构。我读过可变长度的char数组需要是IntPtr,但我还没有弄清楚如何用剩余的字节对其进行编码。我还在一些文章中读到我可能需要第二个结构,但仍然无法弄清楚如何正确地编码它。这是一个这样的site在结构中处理可变长度字符数组的正确方法是什么?结构:[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]publicstructHeader{#regionprivatemem

c# - 在 C# 中新建一个空结构有什么作用?

如果你已经声明了一个结构:structEmptyResult{}在实例中创建类型为EmptyResult的变量的结果是什么?publicFoo(){EmptyResultresult;}您希望在堆栈上进行分配,还是实际上是空操作? 最佳答案 C#编译器强制空结构的大小为1字节。如果您查看反编译器中的结构,您可以看到这一点:[StructLayout(LayoutKind.Sequential,Size=1)]privatestructEmptyResult{}因此类或堆栈中该结构的任何实例都将占用1个字节,与System.Byte或

c# - 扑克牌 : Should they be enum or struct or class?

我正在设计许多(希望是数千)玩家可以同时玩某些纸牌游戏的游戏网站。这副牌是标准的52张牌。每张牌都有花色和等级。牌将一直被洗牌、发牌、挑选、排序、打出。我的问题是,Card应该是枚举、结构还是类?对于枚举:设每张卡片为一个字节0..51。所以一张卡会占用很少的空间。您可以将一只watch示为8个字节的位集。您可以在需要时非常快速地计算给定卡片的花色和点数:即花色(n)=n/13。这将非常有效。如果需要为Cards写方法,就通过扩展方法来写。对于结构:不,这就像编写机器代码。卡是一种简单的结构,保存的数据很少,不可变,很小。它没有太多行为,因此将其设为结构并将其视为被动数据结构。当需要时

c# - 结构的快速序列化/反序列化

我有大量地理数据以仅包含结构的简单对象结构表示。我的所有字段都是值类型。publicstructChild{readonlyfloatX;readonlyfloatY;readonlyintmyField;}publicstructParent{readonlyintid;readonlyintfield1;readonlyintfield2;readonlyChild[]children;}数据被很好地分块到Parent[]-s的一小部分。每个数组包含几千个Parent实例。我有太多数据无法全部保存在内存中,因此我需要将这些block来回交换到磁盘。(一个文件将产生大约2-300KB

c# - 枚举器实现 : Use struct or class?

我注意到List将其枚举器定义为struct,而ArrayList将其枚举器定义为class.有什么不同?如果我要为我的类(class)写一个枚举器,哪个更好?编辑:使用yield无法满足我的要求,所以我正在实现自己的枚举器。也就是说,我想知道遵循List的路线是否会更好。并将其作为结构实现。 最佳答案 像其他人一样,我会选择一个类(class)。可变结构是讨厌的。(正如Jared所建议的那样,我会使用迭代器block。手动编写枚举器代码很费力才能正确。)参见thisthread例如,列表枚举器是一个导致问题的可变结构......