结构 - 它的用途是什么?

lak*_*k-b 7 c# struct

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

有什么建议?

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

jas*_*son 22

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

  • 这绝对是正确的(正如你在其他地方的优秀评论),但可能没有帮助:我认为大多数会问这个问题的人显然不理解引用类型和值类型语义之间的差异. (4认同)
  • 这个答案当然是正确的,但如果你解释了这些差异会更好.其中有一些差异. (3认同)
  • 但问题是“结构 - 它有什么用?” 不是“值类型和引用类型有什么区别”。如果发帖人想知道,那么他应该在评论中提出这个问题,或者甚至更好,提出一个新问题。我相信很多人也很乐意为这个问题提供答案。 (2认同)

kd7*_*kd7 9

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

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

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

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

  • 我讨厌那个指南,因为它讨论了性能问题和struct/stack类/堆实现 - 细节无意义.这些担忧远远落后于主要关注点:语义学. (6认同)

Ste*_*nov 5

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

  • 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

该怎么Foo a = b; a.Mutate();办?

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

在这里使用最少惊喜原则.