9.1 结构体的定义
在C# 中,结构体(struct)是一种轻量级的数据类型,可以用来封装少量相关数据。
结构体与类类似,但有一些重要的区别,结构体是在栈上分配的,而类是在堆上分配的。结构体是值类型数据结构,它使得一个单一变量可以存储各种数据类型的相关数据。
使用结构体的好处包括:占用内存少、传递时不需要参数类型的装箱和拆箱操作、性能高等。但同时也有一些限制,比如不能继承其他结构体或类,也不能自定义无参构造函数等。定义一个结构体,使用struct 。
语法:
[public] struct 结构名
{
成员1;//字段--起名的时候一般以下划线开头
成员2;
……
}
结构体和类的使用差不多,都是先实例化一个对象,然后使用对象名.变量名来访问其中的变量。但是结构体中不能初始化变量的值,而类中可以初始化变量值。
9.2 结构体的作用
1)定义轻量级对象:与类不同,结构体是值类型(Value Type),可以避免在堆中分配内存,因此比类更加轻量级,适合处理简单的数据类型。
2)结构体和其他类型基础数据类型一样,例如int类型、double类型,只不过结构体可以做成我们想要的数据类型。
3)在实际项目中,结构体是大量存在的,使用结构体来封装一些属性来组成新的类型,其目的是简化运算。在一些需要高效处理大量数据的场景下,使用结构体可以显著提高程序的性能。
4)结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。4)结构是C#程序员用来定义自己的值类型的最普遍的机制。结构比枚举更强大,因为它提供函数、字段、构造函数、操作符和访问控制。
5)嵌套使用:结构体可以嵌套在其他结构体或类中,形成复杂的数据结构。
6)与其他语言交互:由于许多其他编程语言中也有结构体的概念,
7)实现接口:结构体可以实现接口,使得它们可以像类一样具有一些面向对象的特性,如多态。因此使用结构体可以方便地与其他语言进行交互。
结构体示例:
namespace 结构
{
public struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
class Program
{
static void Main(string[] args)
{
Books Book1;
Book1.title = "A";
Book1.author = "B";
Book1.subject = "C";
Book1.book_id = 1;
Console.WriteLine("书名:{0},作者:{1},学科:{2},书号: {3}",
Book1.title,Book1.author,Book1.subject,Book1.book_id);
Console.ReadKey();
}
}
输出结果:
书名:A,作者:B,学科:C,书号:1
9.3 结构体的特点
1)结构体是值类型,而不是引用类型。
2)结构体通常用于存储小型数据集合,比如坐标、颜色等。
3)结构体可以包含字段、属性、方法和构造函数。
4)结构体可以实现接口,但不能继承类。
5)结构体不支持析构函数,也不支持显式指定默认构造函数。
6)结构体在传递时会被复制,而不是按引用传递。
9.4 结构体的练习
练习1
public struct XinXi //一个结构型变量
{
public string _name;
public int _age;
public Gender _gender;
}
public enum Gender //一个枚举类型
{
男,
女
}
class Program
{
static void Main(string[] args)
{
XinXi zhangSan,xiaoLan;
zhangSan._name = "张三";
zhangSan._age = 18;
zhangSan._gender = Gender.男;
Console.WriteLine($"你好,我叫{xiaoMing.name},我今年{xiaoMing.age}岁了,
我是{xiaoMing.gender}生");
xiaoLan._name = "小兰";
xiaoLan._age = 20;
xiaoLan._gender = Gender.女;
Console.WriteLine($"你好,我叫{xiaoLan.name},我今年{xiaoLan.age}岁了,
我是{xiaoLan.gender}生");
}
}
练习2
enum orientation : byte
{
north = 1,
south = 2,
east = 3,
west = 4
}
struct route
{
public orientation direction;
public double distance;
}
class Program
{
static void Main(string[] args)
{
route myRoute;
int myDirection = -1;
double myDistance;
Console.WriteLine("1)North\n2)South\n3)East\n4)West");
do
{
Console.WriteLine("Select a direction:");
myDirection = Convert.ToInt32(Console.ReadLine());
} while ((myDirection < 1) || (myDirection > 4));
Console.WriteLine("Input a distance:");
myDistance = Convert.ToDouble(Console.ReadLine());
myRoute.direction = (orientation)myDirection;
myRoute.distance = myDistance;
Console.WriteLine($"myRout specifies a direction of
{myRoute.direction} " + $"and a distance of {myRoute.distance}");
Console.ReadKey();
}
}
9.5 类与结构体
类和结构有以下几个基本的不同点:
1)类是引用类型,结构是值类型。
2)结构不支持继承。
3)结构不能声明默认的构造函数。
结构和类的适用场合分析:
1)当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些。
2)对于点、矩形和颜色这样的轻量对象,假如要声明一个含有许多个颜色对象的数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构的成本较低。
3)在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承。
4)大多数情况下,目标类型只是含有一些数据,或者以数据为主。