Tag: struct

将C ++二维固定长度char数组封装为结构成员

我试图调用一个非托管C ++函数,它有一个结构作为输入参数。 结构在头文件中定义如下: struct MyStruct { int siOrder; char aaszNames[6][25]; int siId[6]; int siTones[6]; }; 我试图将托管结构声明如下: [StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public struct MyStruct { public int siOrder; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=150)] public string aaszNames; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=6, ArraySubType=UnmanagedType.I4)] public int[] siId; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=6, ArraySubType=UnmanagedType.I4)] public int[] siTones; } 但没有任何成功。 我猜测编组失败了,因为aaszNames实际上是一个由六个25长的空终止字符串组成的数组。 我尝试将aaszNames声明为 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=150)] public char[] aaszNames; 必要时用空值填充数组。 但是,再一次,没有。 有什么我想念的吗? 我错了什么? […]

为什么System.DateTime结构具有布局类型Auto?

struct System.DateTime及其表兄System.DateTimeOffset的结构布局类型设置为“Auto”。 这可以通过以下方式看出: typeof(DateTime).IsAutoLayout /* true */ 要么: typeof(DateTime).StructLayoutAttribute.Value /* Auto */ 或者可以从IL中看到它声明: .class public auto ansi serializable sealed beforefieldinit System.DateTime ¯¯¯¯ 通常,使用C#编写的struct(不是枚举的.NET值类型)将具有“Sequential”布局(除非已应用StructLayoutAttribute来指定另一个布局)。 我搜索了一些常见的BCL程序集, DateTime和DateTimeOffset是我在这个布局中找到的唯一公开可见的结构。 有谁知道为什么DateTime有这个不寻常的结构布局?

结构实现接口时会发生什么的详细信息

我最近遇到了这个Stackoverflow问题: 何时使用struct? 在其中,它有一个答案,说了一些有点深刻的东西: 另外,要意识到当一个struct实现一个接口时 – 就像Enumerator那样 – 并且被强制转换为该实现的类型,struct会成为一个引用类型并被移动到堆中。 在Dictionary类的内部,Enumerator仍然是一个值类型。 但是,只要方法调用GetEnumerator(),就会返回引用类型的IEnumerator。 这究竟是什么意思? 如果我有类似的东西 struct Foo : IFoo { public int Foobar; } class Bar { public IFoo Biz{get; set;} //assume this is Foo } … var b=new Bar(); var f=b.Biz; f.Foobar=123; //What would happen here b.Biz.Foobar=567; //would this overwrite the above, or would it have no […]

如何确定Type是一个自定义结构?

对于Type ,C#中有一个属性IsClass ,但如何判断Type是一个struct? 虽然IsValueType是必要条件,但显然还不够。 对于int也是值类型。 有人建议使用以下代码: bool IsStruct = type.IsValueType && !type.IsEnum && !type.IsPrimitive; 但我不确定这是否是一种准确的方法。 该公式应该告诉struct和其他类型之间的区别,例如DateTime , int和array s。 正如一些朋友指出的那样,我指的是用户定义的结构而不是预定义的类型 ,例如DateTime 。

在C#和C之间传递对象

我的应用程序包含带有非托管C dll调用的C#代码。 在我的C#代码中,我有一个对象/类,其属性是系统类型,如string和int以及我定义的其他对象。 我想将这个复杂的(Graph.cs)对象传递给我的C(dll)代码,你会在这里建议什么实现? 我已经尝试过移动结构但是我没有使用除了string和int之外的任何东西。 谢谢。 码: public Class Grpah { TupleCollection m_TupleCollection; int m_nGeneralIndex; bool m_bPrintWRF; string m_sLink; } public Class TupleCollection { IList _collection; } public Class Tuple { Globals.TupleType m_ToppleType; ArrayList m_Parameters; } public class TupleArgs { public string Value { get; set; } public Globals.PAS PAS; public RefCollection RefCollection { get; […]

当一个struct是一个struct时,using语句是什么时候用它的参数?

我对以下代码有一些疑问: using System; namespace ConsoleApplication2 { public struct Disposable : IDisposable { public void Dispose() { } } class Program { static void Main(string[] args) { using (Test()) { } } static Disposable Test() { return new Disposable(); } } } 我的问题是: 在Disposable结构上运行的using语句是否会从Test()框返回结构? 我怎样才能找到自己的答案? 为了试图找出自己,我检查了上面代码生成的IL,这里是Main(…)方法的IL: .method private hidebysig static void Main(string[] args) cil managed { […]

关于结构的问题

MSDN说,一个16字节或更少的类将更好地作为结构[引证]处理 。 这是为什么? 这是否意味着如果一个结构超过16个字节,它的效率低于一个类或它是否相同? 你如何确定你的class级是否在16字节以下? 是什么限制了结构体像一个类一样? (除了禁止无参数构造函数)

T 。包含struct和class的行为方式不同

这是一个后续问题: List .Contains和T []。包含不同的行为 T[].Contains当T是类和结构时, T[].Contains的行为不同。 假设我有这个结构 : public struct Animal : IEquatable { public string Name { get; set; } public bool Equals(Animal other) //<- he is the man { return Name == other.Name; } public override bool Equals(object obj) { return Equals((Animal)obj); } public override int GetHashCode() { return Name == null ? […]

编组包含字符串的结构

我基本上想要从c#中的用户获取int name和string age并将其发送到用c编写的dll方法,其中包含int和char [50]参数并返回字符串.i创建以下场景但我失败了,任何正文都有代码 我有一个用c开发的dll,它有一个结构 struct Argument { int age; char name[50]; } ; 和方法 extern “C” { __declspec(dllexport) Argument FillData(Argument data) { Argument mydata; mydata.age=data.age; for(int i=0;i<=sizeof(data);i++) { mydata.name[i]=data.name[i]; } return mydata; } 我在Cs_dll.cs中的c#中声明它 [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)] public struct Argument { public int age; [MarshalAs(UnmanagedType.TBStr)] //public char name; public char[] name; }; public class Cs_Dll { […]

将Color32 数组快速复制到byte 数组

将Color32[]值array 复制/转换为byte[]缓冲区的快速方法是什么? Color32是Unity 3D的结构,分别包含4 bytes, R, G, B and A respectively 我想要完成的是通过管道将渲染的图像从统一发送到另一个应用程序( Windows Forms )。 目前我正在使用此代码: private static byte[] Color32ArrayToByteArray(Color32[] colors) { int length = 4 * colors.Length; byte[] bytes = new byte[length]; IntPtr ptr = Marshal.AllocHGlobal(length); Marshal.StructureToPtr(colors, ptr, true); Marshal.Copy(ptr, bytes, 0, length); Marshal.FreeHGlobal(ptr); return bytes; } 谢谢,对不起,我是StackOverflow的新手。 Marinescu Alexandru