C# 结构体(Struct)

原文链接:https://www.cnblogs.com/ysmc/p/18802667

介绍

在C#中,结构体(Struct)是一种值类型数据结构,它可以封装不同类型的数据和方法。结构体通常用于表示轻量级的对象,比如坐标点、颜色值、矩形大小等。由于结构体是值类型,当它们被赋值或传递给方法时,会进行值的复制。

定义结构体

要定义一个结构体,你需要使用 struct 关键字,后面跟上结构体的名称和结构体的成员定义。下面是一个简单的结构体定义的例子:

 1 public struct Point
 2 {
 3     public int X;
 4     public int Y;
 5 
 6     public Point(int x, int y)
 7     {
 8         X = x;
 9         Y = y;
10     }
11 
12     public void Move(int dx, int dy)
13     {
14         X += dx;
15         Y += dy;
16     }
17 }

结构体特点

  • 值类型:结构体是值类型,所以它们在赋值或作为方法参数传递时,都会创建一个新的副本。
  • 堆栈分配:结构体通常在栈上分配内存,这意味着它们的分配和回收通常比引用类型(如类)更快。
  • 不支持继承:结构体不能继承其他的结构体或类,并且所有的结构体都隐式继承自 System.ValueType,它本身又继承自 System.Object
  • 可以实现接口:尽管结构体不能继承其他结构体或类,但它们可以实现接口。
  • 成员:结构体可以包含字段、属性、方法、构造函数、索引器、事件和嵌套类型。但是,结构体不能包含无参的构造函数或者析构函数。

使用结构体

你可以像使用简单类型一样使用结构体:

1 var p1 = new Point(0, 0);
2 var p2 = p1; // 创建 p1 的一个副本
3 p2.Move(2, 3);
4 Console.WriteLine(p1.X); // 输出 0
5 Console.WriteLine(p2.X); // 输出 2

在这个例子中,p2 是 p1 的一个副本,所以对 p2 的修改不会影响 p1

结构体和类的对比

  • 存储位置:结构体是值类型,存储在栈上,而类是引用类型,存储在堆上。
  • 性能:结构体可以提供比类更好的性能,特别是当它们用于表示小型数据模型时。
  • 复制行为:结构体的复制是值复制,类的复制是引用复制。
  • 继承:类支持继承,结构体不支持。

何时使用结构体

尽管结构体在某些情况下性能更优,但并不意味着应该总是使用结构体。以下是使用结构体的一些指导原则:

  • 表示的数据量较小。
  • 期望的复制行为是值复制,而不是引用复制。
  • 不需要利用继承。
  • 实例不会频繁地被装箱和拆箱(转换为引用类型和回到值类型,这个过程可能会影响性能)。
posted @ 2025-03-31 18:10  一事冇诚  阅读(6065)  评论(0)    收藏  举报