C# 结构体完全指南:定义、特性、与类的区别及实战
C# 中结构体是值类型数据类型,用struct关键字创建。结构体让单个变量持有多种数据类型的相关数据,常用于表示记录。
定义结构体
使用 struct 语句定义新数据类型,包含多个成员:
struct Books {
public string title;
public string author;
public string subject;
public int book_id;
}
使用示例
using System;
struct Books {
public string title;
public string author;
public string subject;
public int book_id;
}
public class testStructure {
public static void Main(string[] args) {
Books Book1, Book2;
Book1.title = "C Programming";
Book1.author = "Nuha Ali";
Book1.subject = "C Programming Tutorial";
Book1.book_id = 6495407;
Book2.title = "Telecom Billing";
Book2.author = "Zara Ali";
Book2.subject = "Telecom Billing Tutorial";
Book2.book_id = 6495700;
Console.WriteLine("Book 1 title : {0}", Book1.title);
Console.WriteLine("Book 1 author : {0}", Book1.author);
Console.WriteLine("Book 1 subject : {0}", Book1.subject);
Console.WriteLine("Book 1 book_id :{0}", Book1.book_id);
Console.WriteLine("Book 2 title : {0}", Book2.title);
Console.WriteLine("Book 2 author : {0}", Book2.author);
Console.WriteLine("Book 2 subject : {0}", Book2.subject);
Console.WriteLine("Book 2 book_id : {0}", Book2.book_id);
Console.ReadKey();
}
}
输出:
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
C# 结构体特性
- 可包含方法、字段、索引器、属性、运算符方法、事件
- 可定义构造函数,但不能定义析构函数;无法定义无参构造函数(默认自动生成且不可更改)
- 不能继承其他结构体或类
- 不能作为其他结构体或类的基类
- 可实现一个或多个接口
- 成员不能声明为
abstract、virtual或protected - 使用
new创建时调用相应构造函数;也可不使用 new 实例化 - 未用
new时字段未赋值,必须全部初始化后才能使用
类 vs 结构体核心区别
| 特性 | 类 (class) | 结构体 (struct) |
|---|---|---|
| 类型分类 | 引用类型 | 值类型 |
| 继承支持 | 支持 | 不支持 |
| 默认构造函数 | 可自定义 | 自动生成,不可更改 |
| 内存分配 | 堆 | 栈(通常) |
| null 赋值 | 可赋 null | 不可赋 null(除非用 Nullable<T>) |
| 拷贝语义 | 引用拷贝 | 值拷贝 |
进阶示例:带方法的结构体
using System;
struct Books {
private string title;
private string author;
private string subject;
private int book_id;
public void getValues(string t, string a, string s, int id) {
title = t; author = a; subject = s; book_id = id;
}
public void display() {
Console.WriteLine("Title : {0}", title);
Console.WriteLine("Author : {0}", author);
Console.WriteLine("Subject : {0}", subject);
Console.WriteLine("Book_id :{0}", book_id);
}
}
public class testStructure {
public static void Main(string[] args) {
Books Book1 = new Books();
Books Book2 = new Books();
Book1.getValues("C Programming", "Nuha Ali", "C Programming Tutorial", 6495407);
Book2.getValues("Telecom Billing", "Zara Ali", "Telecom Billing Tutorial", 6495700);
Book1.display();
Book2.display();
Console.ReadKey();
}
}
何时使用结构体
- 小型、简单、不可变的数据结构(如坐标点、颜色、日期时间组件)
- 性能敏感场景,避免堆分配和 GC 压力
- 语义上为值类型(如
int、DateTime风格) - 不需要继承、多态的场景
避免:大型结构体(>16 字节)频繁传参会导致栈拷贝开销,此时改用类更合适。
C语言
- 漫画书的演变与制作:从古代艺术到现代产业
- 革新数据存储:带隐形斗篷的次世代磁性纳米结构
- 2021程序员必读17本经典编程书单:从代码技艺到架构思维的进阶之路
- 3D打印晶格结构赋能零件性能:轻量化、强化与减震
- C++结构体与类:嵌入式开发者实战指南
- Nucleus RTOS信号量:实用服务与数据结构
- 书评:《数字化或死亡——IoT驱动转型蓝图》
- 颠覆性技术时代如何留住人性
- C 语言结构体详解:高效组织复杂数据
- C 语言 Typedef 详解:自定义类型名简化代码
- C++数据结构实战:结构体struct定义、访问、函数参数、指针与typedef别名
- Java 经典数据结构:Vector、Stack、Hashtable 等遗留类详解