结构体,值元组
掌握结构体 struct 的定义与特点
理解值类型和引用类型的深层区别
熟练使用值元组返回多个结果
核心讲解
(1)结构体 struct
值类型,栈上分配,轻量,适合表示小型数据对象。
不能继承,隐式继承自
ValueType可以有字段、属性、方法、构造函数
默认构造函数自动生成,初始化所有字段为默认值
适合:点、颜色、坐标等小而简单的数据结构
注意:大结构体反而影响性能,大对象用类
(2)值元组 ValueTuple
C# 7+ 引入,轻量的值类型,用来临时组合多个数据,尤其是方法返回多个值。
语法:
(类型1 名1, 类型2 名2)可以命名,也可以不命名(默认 Item1、Item2...)
支持解构
替代了以前的 out 参数、Tuple 类
操作步骤
定义点结构体
用元组实现方法返回多个值
运行验证
代码示例
// 定义结构体:点
public struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
public void Print()
{
Console.WriteLine($"坐标:({X}, {Y})");
}
}
// 元组示例:计算除法,返回商和余数
(int quotient, int remainder) Divide(int a, int b)
{
int q = a / b;
int r = a % b;
return (q, r);
}
// ===== 测试结构体 =====
Point p1 = new Point(10, 20);
p1.Print();
// 值类型赋值是复制
Point p2 = p1;
p2.X = 100;
Console.WriteLine("p1.X 还是:" + p1.X); // 还是10,值类型复制值
// ===== 测试元组 =====
var result = Divide(10, 3);
Console.WriteLine($"\n商:{result.quotient},余数:{result.remainder}");
// 解构
(int q, int r) = Divide(20, 6);
Console.WriteLine($"解构:商={q},余={r}");
// 简写元组
var (name, age) = ("张三", 20);
Console.WriteLine($"\n{name},{age}岁");
Console.ReadKey();
常见误区
结构体和类分不清:小数据、值语义用 struct;大的、有行为、引用语义用 class
结构体无参构造自己写:默认无参构造是系统的,不能自己定义无参构造(C# 10 + 可以)
Tuple 和 ValueTuple 混淆:Tuple 是引用类型,老的;ValueTuple 是值类型,性能好,推荐用
元组命名不规范:方法返回元组要命名,提高可读性,不要用 Item1
课后练习
定义一个 Color 结构体,有 R、G、B 三个字节字段
写一个方法,接收两个数字,返回它们的和、差、积(用元组)
对比结构体和类的 3 个核心区别
思考:什么时候用结构体,什么时候用类?

