结构 – 它的用途是什么?

我对struct类型有所了解。 但我无法理解:这是为了什么? 我什么时候用它? 类,简单的值类型和枚举 – 这就是我所需要的。

有什么建议?

UPD:请! 不要告诉我结构在堆栈中(我知道这个:)。 什么结构用于?

如果需要值类型语义,可以选择结构。 如果需要引用类型语义,则选择一个类。 所有其他问题都是次要问题。

MSDN提供了一个指南: 在类和结构之间进行选择 :

如果类型的实例很小并且通常是短暂的或通常嵌入在其他对象中,则考虑定义结构而不是类。

除非类型具有以下所有特征,否则不要定义结构:

  • 它在逻辑上表示单个值,类似于基本类型(整数,双精度,>等)。
  • 它的实例大小小于16个字节。
  • 这是不可改变的。
  • 它不必经常装箱。

应该是结构的东西(因为它们是值):

  • struct Color
  • struct Point
  • struct Rectangle
  • struct GLVertex (包含位置,颜色,法线和texcoord)
  • struct DateTime

应该是一个类的东西(因为它们是你所指的东西):

  • class RandomGenerator
  • class Socket
  • class Thread
  • class Window

为什么? 请考虑以下代码。

 class Button { public Point Location { get; set; } } class Program { public static void Main() { var button = Util.GetButtonFromSomewhere(); var location = button.Location; Util.DrawText("one", location); location.Y += 50; Util.DrawText("two", location); location.Y += 50; Util.DrawText("three", location); } } 

这将绘制3个垂直对齐的文本标签。 但是如果Point是一个类,这也会移动按钮 ,这实际上是意料之外的: var location = button.Location感觉它应该复制一个值,而不是一个引用! 换句话说,我们将Point视为值类型而不是引用类型。 这里的“价值”用于数学意义上的价值 。 考虑数字5,它是一个抽象对象“在某处”,你只是“引用”它。 同样,一个点就是 。 它不在任何地方,我们无法改变它。 因此我们选择使它成为一个结构,因此它具有用户期望的语义。

另一方面,我们可以有class Button { public Window Parent { get; set; } } class Button { public Window Parent { get; set; } } class Button { public Window Parent { get; set; } } 。 这里, Parent是一个实体 ,所以我们用引用类型 – Window表示它。 使用像myButton.Parent.Redraw();这样的代码是有意义的myButton.Parent.Redraw(); 。 所以Window应该是一个类。

到现在为止还挺好。 但这一切对你来说可能听起来太模糊了。 你如何真正决定某些东西“感觉”像参考或价值? 我的经验法则很简单:

Foo a = b; a.Mutate();应该怎样Foo a = b; a.Mutate(); Foo a = b; a.Mutate(); 做?

  • 如果它看起来应该保持不变,那么让Foo成为一个结构。
  • 否则就成为一个class级。

在这里使用最少惊喜的原则 。

简单值类型最好通过结构实现。

结构使用指南

建议您对满足以下任何条件的类型使用结构:

 * Act like primitive types. * Have an instance size under 16 bytes. * Are immutable. * Value semantics are desirable. 

您还必须了解在堆上分配了类实例。 结构 – 是一个vallue类型 – 并在堆栈上分配。

首先,您必须了解值类型和引用类型之间的区别。 我会假设,因为你说跳过那部分,你明白它是什么。

Struct是一种值类型,您将获得使用值类型的所有权限。

  • 结构按值传递。 当你做的事情

    DateTime time = new DateTime(); DateTime newTime =时间; //您没有引用时间//而是创建了一个新实例

  • 结构不是轻量级类,它们可能有很多方法,只需查看DateTime结构。

  • 结构可能性能较轻,但并非总是如此。 考虑将大型结构传递给方法。 因为每次将结构传递给方法时结构都是值类型,所以创建了结构的新实例,因此每次都复制结构。 如果你有一个相当大的结构,这将是一个更大的性能命中。

  • 您可能偶尔会使用box和unbox结构,因为它们是值类型。

简而言之,使用结构来表示内存中的primefaces值。

当你想要一个带有值(而不是引用)语义的“类”时,你可以使用结构。

结构用于表示某些内容的对象,该内容的标识由存储在其属性中的值定义,而不是由Id或键定义。 这些被称为“值类型”,而不是称为“实体类型”的对象,其身份随着时间的推移而持续存在,并且不依赖于对象属性的值。

例如,尽管Person的地址,电话号码,雇主等可能会从一个实例更改为另一个实例,但Person类(实体)具有从一个会话到另一个会话,甚至每年都会持续存在的身份。 如果您无意中同时在内存中有两个Person类实例(代表相同的个体/实体),那么它们的属性具有相同的值非常重要。

CalendarMonth对象otoh(值类型)仅具有由值指定的标识,该值指定它是哪个日历月…无论您可能使用多少个“March 2009”实例,它们都是可互换且等效的。 另一个例子可能是在税收计划中代表财政年度指定的对象。 一个很好的例子是地址对象。 (这里不是谈论地址与个人或企业或任何其他实体的关联,而只是地址本身)。 更改地址的任何属性使其成为不同的地址。 在内存中创建地址对象后,它与每个具有相同属性的其他地址对象等效并可互换。 这就是为什么这些值类型通常应该是不可变的。 如果需要,可以使用所需的属性值创建一个新的,并在完成使用后将其丢弃。

如果你不知道为什么需要它,你可能不知道。

struct是值类型而不是引用类型。 如果您不知道这意味着什么,那么您可能根本不需要它。

示例:假设您希望数据类型表示XY Z处的坐标。您实际上不需要任何function,只需要三个变量。 一个结构对此有好处,一个类可能有点矫枉过正。

实际上,我认为struct是C的遗产。我认为我们不得在任何条件下使用它。 也许有时候你觉得把东西放在堆栈而不是堆上更有效率; 但是因为Java / C#永远不会像第一站一样高效,所以只是忽略它:)这是我的看法。