Tag: struct

CLR顺序结构布局:对齐和大小

默认情况下,C#中的所有struct都被视为[StructLayout(LayoutKind.Sequential)]标记的值类型。 所以让我们采取一些struct并检查这个struct的大小: using System; using System.Reflection; using System.Linq; using System.Runtime.InteropServices; class Foo { struct E { } struct S0 { byte a; } struct S1 { byte a; byte b; } struct S2 { byte a; byte b; byte c; } struct S3 { byte a; int b; } struct S4 { int a; byte […]

从C#调用FORTRAN dll并将值分配给结构数组

我可以将一个C#结构传递给FORTRAN就好了。 我甚至可以在FORTRAN传递一个C#结构数组作为TYPE()数组。 我遇到麻烦的地方是当我试图将值返回到C# 。 这是一个例子: fortran dll是: MODULE TESTING TYPE VALUEREF INTEGER*4 :: A ENDTYPE VALUEREF CONTAINS SUBROUTINE TEST_REF(T,N) !DEC$ ATTRIBUTES DLLEXPORT :: TEST_REF !DEC$ ATTRIBUTES ALIAS:’TEST_REF’ :: TEST_REF !DEC$ ATTRIBUTES VALUE :: N IMPLICIT NONE INTEGER*4 :: A,I,N TYPE(VALUEREF) :: T(N) A = 100 DO I=1,N T(I)%A = A + I END DO END […]

blittable类型的非blittable错误

我有这个结构和这段代码: [StructLayout(LayoutKind.Sequential, Pack = 8)] private class xvid_image_t { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public int[] stride; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] // public IntPtr[] plane; } public int decore() { xvid_image_t myStruct = new xvid_image_t(); myStruct.stride = new int[4]; // can be commented out – same result GCHandle.Alloc(myStruct, GCHandleType.Pinned); // … } 当我尝试运行它时,我得到一个ArgumentException : 对象包含非原始或非blittable数据 […]

编译错误。 使用带有struct的属性

请解释struct构造函数的以下错误。 如果我将struct更改为class,那么错误就会消失。 public struct DealImportRequest { public DealRequestBase DealReq { get; set; } public int ImportRetryCounter { get; set; } public DealImportRequest(DealRequestBase drb) { DealReq = drb; ImportRetryCounter = 0; } } 错误CS0188:在分配所有字段之前,不能使用“this”对象 错误CS0843:在将控制权返回给调用者之前,必须完全分配自动实现的属性“DealImportRequest.DealReq”的备份字段。 考虑从构造函数初始化程序中调用默认构造函数。

当涉及到可变值类型时,如何处理async / await产生的副作用?

请考虑以下示例代码: using System.Diagnostics; using System.Threading.Tasks; public struct AStruct { public int Value; public async Task SetValueAsync() { Value = await Task.Run(() => 1); } public void SetValue() { Value = 1; } } class Program { static void Main(string[] args) { Test(new AStruct()); TestAsync(new AStruct()).Wait(); } private static async Task TestAsync(AStruct x) { Debug.Assert(x.Value == […]

如何检查结构是否已实例化?

我有一个结构(为了这个问题的目的)几乎模仿内置的Point类型。 我需要在使用它之前检查它是否已被实例化。 当它是Point ,我可以这样做: if (this.p == null) 但是现在会产生以下错误: 运算符’==’不能应用于’ProportionPoint’和”类型的操作数 如何将我的结构与null进行比较? 还有另一种检查实例化的方法吗?

如何在结构构造函数中设置自动属性支持字段的值?

给出这样的结构: public struct SomeStruct { public SomeStruct(String stringProperty, Int32 intProperty) { this.StringProperty = stringProperty; this.IntProperty = intProperty; } public String StringProperty { get; set; } public Int32 IntProperty { get; set; } } 当然,会生成一个编译器错误,读取“this”对象在分配所有字段之前无法使用 。 有没有办法为支持字段或属性本身分配值,还是我必须使用我自己的显式支持字段以老式的方式实现属性?

为什么在结构中使用LINQ时必须复制“this”(如果我这样做,那么它是否可以)?

下面的代码在不可变结构中包含一个简单的LINQ查询。 struct Point { static readonly List NeighborIndexes; //and other readonly fields! public IEnumerable GetEdges() { return from neighborIndex in NeighborIndexes; select GetEdge(neighborIndex); } } 它不编译。 结构体内的匿名方法,lambda表达式和查询表达式无法访问“this”的实例成员。 考虑将“this”复制到匿名方法,lambda表达式或查询表达式之外的局部变量,并使用local。 有谁知道为什么不允许这样做? 修复消息建议工作正常: public IEnumerable GetEdges() { var thisCopy = this; return from neighborIndex in NeighborIndexes; select thisCopy.GetEdge(neighborIndex); } 但这是标准做法吗? 是否有理由在结构中没有这样的查询? (在制作副本的更大方案中,并不担心我的表现如此)。

为什么System.Windows.Point和System.Windows.Vector是可变的?

鉴于可变结构通常被认为是邪恶的(例如, 为什么可变结构“邪恶”? ),是否有潜在的好处可能促使.NET框架的设计者制作System.Windows.Point和System.Windows.Vector可变的? 我想理解这一点,所以我可以决定是否有必要使我自己的类似结构可变(如果有的话)。 将Point和Vector变为可变的决定可能只是判断错误,但如果有充分的理由(例如,性能优势),我想了解它是什么。 我知道我偶然发现了Vector.Normalize()方法的实现,因为它惊讶(!),不会返回一个新的Vector 。 它只是改变了当前的向量。 我一直认为它应该像这样工作: var vector = new Vector(7, 11); var normalizedVector = vector.Normalize(); // Bzzz! Won’t compile 但它实际上是这样的: var vector = new Vector(7, 11); vector.Normalize(); // This compiles, but now I’ve overwritten my original vector ……所以,似乎不变性只是为了避免混淆是一个好主意,但同样,也许在某些情况下可能会引起混淆。

结构的快速序列化/反序列化

我有大量的地理数据表示在简单的对象结构中,只包含结构。 我的所有字段都是有价值的类型。 public struct Child { readonly float X; readonly float Y; readonly int myField; } public struct Parent { readonly int id; readonly int field1; readonly int field2; readonly Child[] children; } 数据很好地分配给Parent[] -s的一小部分。 每个数组包含几千个父实例。 我有太多的数据来保存所有内存,所以我需要来回交换这些块到磁盘。 (一个文件大约2-300KB)。 对于dumpint到磁盘并回读,将Parent[]序列化/反序列化为byte[]的最有效方法是什么? 关于速度, 我对快速反序列化特别感兴趣 ,写入速度并不是那么关键。 简单的BinarySerializer会不够好? 或者我应该使用StructLayout (参见接受的答案) ? 我不确定这是否适用于Parent.children数组字段。 更新:对注释的响应 – 是的,对象是不可变的(代码更新),并且children字段实际上不是值类型。 300KB听起来并不多,但我有数以万计的文件,所以速度确实很重要。