C#结构体(Struct)¶
在C#中,结构体是只类型数据结构.它使得一个单一变量可以存储各种数据类型的相关数据.struct关键字用于创建结构体.
结构体是用来代表一个记录.假设您想跟踪图书馆中书册动态.您可能想跟踪一下属性:
- title
- author
- subject
- book_id
1.定义结构体¶
为了定义结构体,您必须使用struct语句,struct语句为程序定义了一个带有多个成员的新的数据类型.
例如:
struct Book
{
public string title;
public string author;
public string subject;
public int book_id;
}
实例:
/* 第一本书 */
Book book1 = new Book();
book1.title = "追寻生命的意义";
book1.author = "弗兰克尔";
book1.subject = "推荐书籍";
book1.book_id = 1;
/* 第二本书 */
Book book2 = new Book();
book2.title = "拖延心理学";
book2.author = "[美]简·博克/[美]莱诺拉·袁";
book2.subject = "值得阅读的书籍";
book2.book_id = 2;
/*打印第一本书的信息*/
Console.WriteLine("第一本书书名:{0}", book1.title);
Console.WriteLine("第一本书作者:{0}", book1.author);
Console.WriteLine("第一本书简介:{0}", book1.subject);
Console.WriteLine("第一本书 i d:{0}", book1.book_id);
Console.WriteLine();
/*打印第二本书的信息*/
Console.WriteLine("第二本书书名:{0}", book2.title);
Console.WriteLine("第二本书作者:{0}", book2.author);
Console.WriteLine("第二本书简介:{0}", book2.subject);
Console.WriteLine("第二本书 i d:{0}", book2.book_id);
Console.ReadKey();
结果
第一本书书名:追寻生命的意义
第一本书作者:弗兰克尔
第一本书简介:推荐书籍
第一本书 i d:1
第二本书书名:拖延心理学
第二本书作者:[美]简·博克/[美]莱诺拉·袁
第二本书简介:值得阅读的书籍
第二本书 i d:2
2.C#结构的特点¶
- 结构可带有方法、字段、索引、属性、运算符方法和事件。
- 结构体可定义构造函数,但不能定义解析函数。但是,您不能为结构定义默认的构造函数。默认的构造函数是自动定义的,不能被改变。
- 与类不同,构造不能继承其他的结构或者类。
- 结构可以实现一个或者多个接口。
- 结构成员不能指定为
abstract、virtual、private和proteched - 当你使用
New操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可不使用New操作符即可实例化。 - 如果不使用
New操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。 - 结构体的构造函数中,必须为结构体所有字段赋值,类的构造函数无此限制
3.类Vs结构¶
类和结构有一下几个基本的不同点:
- 类是引用类型,结构是值类型
- 结构不支持继承
- 结构不能生命默认的构造函数
类的对象是存储在堆空间中,结构存储在栈中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。故而,当我们描述一个轻量级对象的时候,结构可提高效率,成本更低。当然,这也得从需求出发,假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝,就应该使用类了。
4.结构和类的适用场合¶
- 1、当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些;
- 2、对于点、矩形和颜色这样的轻量对象,假如要声明一个含有许多个颜色对象的数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构的成本较低;
- 3、在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承。
- 4、大多数情况下,目标类型只是含有一些数据,或者以数据为主。