C# 结构体(Struct)精讲
一、结构体的概念在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。二、使用结构体的示例为了定义一个结构体,您必须使用 struct 语句。struct 语句为程序定义了一个带有多个成员的新的数据类型。1、声明结构体//Pascal命名规则struct Per{//里面的一些属性public string name;publi
前言:本文介绍了C#中很重要的结构体(Struct),通过本博文的阅读,你可以掌握结构体的概念、用法,以及它与类的区别。
一、结构体的概念
在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。
二、使用结构体的示例
为了定义一个结构体,我们必须使用 struct 语句。struct 语句为程序定义了一个带有多个成员的新的数据类型。
1、声明结构体
// 用struct关键字,后面跟结构体的名字
// Pascal命名规则
struct Per
{
// 一次性声明多个类型的变量
public string name;
public int age;
public string sex;
/// <summary>
/// 打招呼的方法
/// </summary>
public void sayhello()
{
Console.WriteLine("大家好,我叫{0},我的年龄为{1},我的性别为{2}",name,age,sex);
}
};
2、在主方法内,调用这个结构体,并且赋值
Per p1; // 声明p1,类型为Per
// p1详述
p1.name = "张三";
p1.age = 23;
p1.sex = "男";
p1.sayhello();
Per p2 = new Per(); // 实例化p2,类型为Per
// p2详述
p2.name = "李思";
p2.sayhello();
// 注意:p2的age、sex,我们并没有赋值,详细的知识,会在博文最后讲到,请注意查看!
3、执行效果图
三、使用结构体的好处
继续上面这个案例,假定我们现在要输入、输出1000个学生的信息,那么我们在给学生的属性取名时,很是麻烦的,而且也不高效,代码可读性、精简性、优美性不强。 那么为了避免这些问题,我们就可以使用结构体的这种方式,来进行解决。当然结构体与枚举,也可以一起使用,枚举相关知识,请查看本人另一篇博文:C# 枚举(Enum)精讲
四、结构体与类的区别
相信有一部分细心的朋友,也发现了结构体与类有部分相似的地方,那么接下来,让我们就学习下它们之间的区别。
- 结构体中声明的字段无法赋予初值,类可以。
- 结构体是值类型,类是引用类型。结构体不支持继承,也不能声明默认的构造函数。
- 结构体的构造函数中,必须为结构体所有字段赋值,类的构造函数无此限制。
- 结构体是值类型,它在栈中分配空间;而类是引用类型,它在堆中分配空间,栈中保存的只是引用。
- 结构体类型直接存储成员数据,而类的数据位于堆中,位于栈中的变量保存的是指向堆中数据对象的引用。
- 由于结构体是值类型,并且直接存储数据,因此在一个对象的主要成员为数据且数据量不大的情况下,使用结构体会带来更好的性能。
- 因为结构体是值类型,因此在为结构体分配内存,或者当结构体超出了作用域被删除时,性能会非常好,因为它们将内联或者保存在堆栈中。当把一个结构体类型的变量赋值给另一个结构体时,对性能的影响取决于结构体的大小,如果结构体的数据成员非常多而且复杂,就会造成损失。
五、结构体和类的适用场合
- 当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构体好一些。
- 对于点、矩形和颜色这样的轻量对象,假如要声明一个含有许多个颜色对象的数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构体的成本较低。
- 在表现抽象和多级别的对象层次时,类是最好的选择,因为结构体不支持继承。
- 大多数情况下,目标类型只是含有一些数据,或者以数据为主。
补充:结构体与类的选择
首先我们要明确,类的对象是存储在堆空间中,结构体存储在栈中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。故而,当我们描述一个轻量级对象的时候,结构体可提高效率,成本更低。当然,这也得从需求出发,假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝,就应该使用类了。
六、C#结构体的特点
- 结构体可带有方法、字段、索引、属性、运算符方法和事件。
- 结构体可定义构造函数,但不能定义析构函数。但是,不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。
- 与类不同,结构体不能继承其他的结构体或类。结构体不能作为其他结构体或类的基础结构体。
- 结构体可实现一个或多个接口。
- 结构体成员不能指定为 abstract、virtual 或 protected。
- 当使用 new 操作符创建一个结构体对象时,会调用适当的构造函数来创建结构体。与类不同,结构体可以不使用 new 操作符即可被实例化。
- 如果不使用 new 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用,若不初始化所有字段,则抛出错误。反之,如果我们使用了 new 操作符进行创建,那么可不初始化所有字段,就进行使用,若不初始化,那么将采用默认值。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)