长寿命对象的结构与类

Joa*_*nge 15 .net c# struct class

当你需要拥有非常小的物体时,比如说它包含2个浮动属性,并且你将拥有数百万个不会立即被"摧毁"的物体,结构是更好的选择还是类?

就像在xna中作为库一样,有point3s等作为结构但是如果你需要长时间保持这些值,它会造成性能威胁吗?

Guf*_*ffa 34

与大多数关于结构的问题相反,这实际上似乎是对结构的良好使用.如果它包含的数据是值类型,并且您将使用大量这些数据,那么结构将很有效.

一些技巧:

::结构不应大于16个字节,否则会失去性能优势.

::使结构不可变.这使得使用更清楚.

例:

public struct Point3D {

   public float X { get; private set; }
   public float Y { get; private set; }
   public float Z { get; private set; }

   public Point3D(float x, float y, float z) {
      X = x;
      Y = y;
      Z = z;
   }

   public Point3D Invert() {
      return new Point3D(-X, -Y, -Z);
   }

}
Run Code Online (Sandbox Code Playgroud)

  • 这可能是readonly关键字的一个很好的用法,即不是将X,Y和Z声明为属性,而是可以拥有只读字段.优点是你不会错误地破坏你的不变性. (4认同)

ags*_*mek 5

答案取决于最终存储对象/值的位置.如果它们要存储在像ArrayList这样的无类型集合中,那么你最终将它们装箱.Boxing为结构创建一个对象包装器,并且脚印与类对象相同.另一方面,如果您使用类似T []或List的类型数组,那么使用结构只会存储每个元素的实际数据,仅包含整个集合的覆盖区而不是其元素.

因此,在T []数组中使用结构更有效.