C# 结构(Struct)

结构简介

在 C# 中,结构是一种值类型。与类不同,类是引用类型。这意味着当您创建一个类的实例时,它会分配在堆上,并且您可以使用引用访问它。而结构则是在栈上分配的。结构通常用于表示简单的数据集,例如坐标、日期等。

结构可以包含字段、属性、方法和其他成员,但它们与类相比有一些重要的区别。结构更适用于轻量级的数据封装,尤其是在需要频繁复制和传递的情况下。由于结构是值类型的,因此它们的行为更类似于内置类型,如 int 或 float。

定义结构

定义结构与定义类类似,但使用 struct 关键字代替 class。下面是一个简单的结构定义示例:

-- -------------------- ---- -------
------ ------ -----
-
    ------ --- --
    ------ --- --

    ------ --------- -- --- --
    -
        - - --
        - - --
    -

    ------ ---- ---------- ----- --- -----
    -
        - - -----
        - - -----
    -
-

在这个例子中,我们定义了一个名为 Point 的结构,用于表示二维空间中的一个点。这个结构包含两个公共字段 XY,以及一个构造函数和一个方法 MoveTo

结构的实例化

与类一样,结构也可以通过构造函数进行实例化。但是,由于结构是值类型,所以当你将结构赋给另一个变量或作为参数传递时,实际上是将结构的副本传递过去。这与类的行为不同,类是引用类型,传递的是对对象的引用。

在这个例子中,当我们从 p1 赋值给 p2 时,实际上是将 p1 的当前值复制到了 p2 中。因此,当我们调用 MoveTo 方法改变 p2 的位置时,p1 的值不会受到影响。

结构中的方法

结构可以包含各种方法,包括实例方法、静态方法和运算符重载。这些方法与类中的方法非常相似,但在处理值类型时需要注意一些细节。

实例方法

实例方法是与结构实例相关联的方法。它们可以访问和修改结构的实例字段。

静态方法

静态方法属于结构本身而不是它的实例。你可以通过结构名直接调用静态方法,而无需创建结构的实例。

运算符重载

结构允许重载运算符,使得结构实例可以像内置类型那样进行操作。

-- -------------------- ---- -------
------ ------ ----- -------- ------- -- ----- --
-
    ------ --- --------- - ---- --- - -----
-

-- --
----- -- - --- --------- ----
----- -- - --- --------- ----
----- -- - -- - --- -- --- ----- -- - --- --------- ----

结构与类的区别

虽然结构和类都可以用来封装数据和行为,但它们在某些方面有所不同:

  • 内存管理:结构是值类型,而类是引用类型。这意味着结构实例在栈上分配内存,而类实例在堆上分配内存。
  • 继承:结构不能从其他结构或类派生,但可以实现接口。
  • 默认构造函数:结构不允许显式地定义无参数的构造函数,但可以通过初始化器来创建实例。
  • 赋值和传递:当结构被赋值或作为参数传递时,实际上是在传递其副本。类则是传递引用。

总结

结构是 C# 中一种重要的值类型,非常适合用于表示简单数据集。理解结构与类之间的区别以及如何有效地使用它们,对于任何 C# 开发者来说都是非常重要的技能。

纠错
反馈