Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 结构-它的用途是什么?_C#_Struct - Fatal编程技术网

C# 结构-它的用途是什么?

C# 结构-它的用途是什么?,c#,struct,C#,Struct,我对structtype有所了解。但我不明白:这是干什么用的?我什么时候用过?类、简单值类型和枚举-这就是我所需要的 有什么建议吗 UPD:拜托!不要告诉我struct在堆栈中(我知道:)。struct的用途是什么 MSDN提供了一个指南: 如果类型的实例很小且通常很短,或者通常嵌入到其他对象中,请考虑定义一个结构而不是类 除非类型具有以下所有特征,否则不要定义结构: 它在逻辑上表示单个值,类似于基本类型(整数、双精度、>等) 它的实例大小小于16字节 它是不变的 它不必经常装箱 当您需要具

我对
struct
type有所了解。但我不明白:这是干什么用的?我什么时候用过?类、简单值类型和枚举-这就是我所需要的

有什么建议吗

UPD:拜托!不要告诉我struct在堆栈中(我知道:)。struct的用途是什么

MSDN提供了一个指南:

如果类型的实例很小且通常很短,或者通常嵌入到其他对象中,请考虑定义一个结构而不是类

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

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

当您需要具有值(而不是引用)语义的“类”时,可以使用结构。

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


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

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

结构使用指南

建议您使用 满足以下条件之一的类型的结构 以下标准:

* Act like primitive types.
* Have an instance size under 16 bytes.
* Are immutable.
* Value semantics are desirable.
您还必须了解,类实例是在堆上分配的。
结构-是vallue类型-并在堆栈上分配。

示例:假设您想要一个数据类型来表示X Y Z处的坐标。您实际上不需要任何功能,只需要三个变量。一个结构就可以做到这一点,一个类可能有点过头了。

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

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

Struct是一种值类型,您可以获得使用该值类型所需的所有特权

  • 结构是按值传递的。当你做这样的事情时

    日期时间=新的日期时间(); DateTime newTime=时间; //你不是在引用时间 //而是创建了一个新实例

  • 结构不是轻量级类,它们可能有许多方法,只要看看
    DateTime
    struct

  • 结构可能在性能上更轻,但并非始终如此。考虑将一个大的结构传递给一个方法。由于每次将结构传递给方法时,结构都是值类型,因此会创建一个新的结构实例,从而每次都复制该结构。如果你有一个相当大的结构,这将是一个更大的性能打击

  • 您可能需要偶尔对结构进行装箱和取消装箱,因为它们是值类型


简而言之,使用结构表示内存中的原子值

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

  • struct Color
  • struct Point
  • struct Rectangle
  • struct GLVertex
    (包含位置、颜色、法线和texcoord)
  • struct DateTime
应该成为一个类的事物(因为它们是您所指的事物):

  • 类随机生成器
  • 类套接字
  • 类线程
  • 类窗口
为什么?? 考虑下面的代码。

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
感觉它应该复制一个值,而不是一个引用!换句话说,我们认为点是一种值类型,而不是引用类型。这里的“值”用于数学意义上的值。考虑数字5,它是一个抽象的物体“某处外面”,你只是“参考”它。类似地,一个点就是
。它不存在于任何地方,我们不能改变它。因此,我们选择使它成为一个结构,这样它就具有了用户期望的语义

另一方面,我们可以使用
类按钮{public Window Parent{get;set;}}
。这里,
Parent
是一个实体,因此我们用一个引用类型-
窗口
来表示它。使用类似于
myButton.Parent.Redraw()的代码可能是有意义的。所以
Window
应该是一个类

到目前为止还不错。但这一切对你来说可能太模糊了。你如何真正决定某件东西“感觉”像是参考还是价值?我的经验法则很简单:

什么应该
Foo a=b;a、 突变()做什么

  • 如果看起来应该保持b不变,那么将Foo设为一个struct
  • 否则就让它成为一门课

使用here.

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

例如,一个人类(实体)的身份在一个会话到另一个会话之间持续存在,甚至是年复一年,不管这个人的地址、电话号码、雇主等如何从一个实例到另一个实例发生变化。如果您无意中同时在内存中有两个Person类实例,它们表示相同的个人/实体,那么它们的属性值必须相同

CalendarMonth对象otoh(一种值类型)只有一个由指定它是哪个日历月的值定义的标识。。。无论您使用多少个“2009年3月”实例,它们都是al