Tag: struct

为什么必须使用非默认构造函数初始化C#struct中的所有字段?

我想试试这段代码: public struct Direction { private int _azimuth; public int Azimuth { get { return _azimuth; } set { _azimuth = value; } } public Direction(int azimuth) { Azimuth = azimuth } } 但它在编译时失败,我理解struct需要初始化它的所有字段。 但我想了解在CLR \ IL引擎盖下发生了什么。 为什么它需要在任何其他方法\ property \ this等之前的所有字段 谢谢。

获取对数组内部结构的引用

我想修改一个结构的字段,该结构在一个数组内,而不必设置整个结构。 在下面的示例中,我想在数组中设置元素543的一个字段。 我不想复制整个元素(因为复制MassiveStruct会损害性能)。 class P { struct S { public int a; public MassiveStruct b; } void f(ref S s) { sa = 3; } public static void Main() { S[] s = new S[1000]; f(ref s[543]); // Error: An object reference is required for the non-static field, method, or property } } 有没有办法在C#中做到这一点? 或者我总是要从数组中复制整个结构,修改副本,然后将修改后的副本放回到数组中。

为什么没有new关键字可以实例化一个struct?

为什么我们没有被强制实例化一个结构,比如在使用类时?

无法更改generics集合中struct的成员值

想象一下这个struct : struct Person { public string FirstName { get; set; } public string LastName { get; set; } } 以下代码: var list = new List(); list.Add(new Person { FirstName = “F1”, LastName = “L1” }); list.Add(new Person { FirstName = “F2”, LastName = “L2” }); list.Add(new Person { FirstName = “F3”, LastName = “L3” […]

sizeof()结构未知。 为什么?

为什么我不能在简单的结构上使用sizeof()? 例如: private struct FloatShortPair { public float myFloat; public short myShort; }; int size = sizeof(FloatShortPair); //CS0233 错误CS0233:’FloatShortPair’没有预定义的大小,因此sizeof只能在不安全的上下文中使用(考虑使用System.Runtime.InteropServices.Marshal.SizeOf) MSDN声明: sizeof运算符只能用于编译时常量类型。 如果您收到此错误,请确保可以在编译时确定标识符的大小。 如果不能,则使用SizeOf而不是sizeof。 float和short如何不编译时间常量? 8 /

C# – 值类型等于方法 – 为什么编译器使用reflection?

我只是遇到了一些非常奇怪的东西:当你在值类型上使用Equals()方法时(如果这个方法当然没有被覆盖)你会得到一些非常慢的东西 – 使用一对一的字段进行比较反思! 如: public struct MyStruct{ int i; } (…) MyStruct s, t; si = 0; ti = 1; if ( s.Equals( t )) /* si will be compared to ti via reflection here. */ (…) 我的问题:为什么C#编译器不生成比较值类型的简单方法? 像(在MyStruct的定义中): public override bool Equals( Object o ){ if ( this.i == oi ) return true; else […]

为什么结构需要装箱?

在C#中,任何用户定义的struct都自动成为System.Struct System.ValueType和System.Struct的子类System.ValueType是System.Object的子类。 但是当我们为对象类型引用分配一些结构时,它会被装箱。 例如: struct A { public int i; } A a; object obj = a; // boxing takes place here 所以我的问题是:如果A是System.Object的后代,编译器是否不能将其上传到对象类型而不是装箱?

C#Structs:未分配的局部变量?

从文档 : 与类不同,可以在不使用新运算符的情况下实例化结构。 那我为什么会收到这个错误: 使用未分配的局部变量’x’ 当我尝试这样做? Vec2 x; xX = det * (a22 * bX – a12 * bY); xY = det * (a11 * bY – a21 * bX); Vec2 x是一个结构?

为什么struct可以改变自己的领域?

考虑Foo结构如下: struct Foo { public float X; public float Y; public Foo(float x, float y) { this.X = x; this.Y = y; } public void Change(float x) { this.X = x; } } 我理解在构造函数中修改字段,这对我和我理解结构作为值,类似数字的不可变类型是完全合乎逻辑的。 但是,因为人们做不到: Foo bar = new Foo(1, 2); bar.X = 5; 为什么可以使用: Foo bar = new Foo(1, 2); bar.Change(5); 编辑 :如果结构是可变的,那么为什么它们不能在列表中修改或从属性返回? 无法修改表达式,因为它不是变量

在不存在的结构布局中循环

这是我的一些代码的简化版本: public struct info { public float a, b; public info? c; public info(float a, float b, info? c = null) { this.a = a; this.b = b; this.c = c; } } 问题是错误Struct member ‘info’ causes a cycle in the struct layout. 我喜欢结构类似于值类型的行为。 我可以使用类和克隆成员函数来模拟这个,但我不明白为什么我需要。 这个错误是怎么回事? 在某些类似的情况下,递归可能会永远导致构造,但在这种情况下我无法想到它的任何方式。 下面是程序编译时应该没问题的例子。 new info(1, 2); new info(1, 2, null); […]