C# 结构体(Struct)
在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。
结构体是用来代表一个记录。假设想跟踪图书馆中书的动态。可能需要跟踪每本书的以下属性:
- Title
- Author
- Subject
- Book ID
定义结构体
为了定义一个结构体,必须使用 struct 语句。struct 语句为程序定义了一个带有多个成员的新的数据类型。
例如,可以按照如下的方式声明 Book 结构:
struct Books { public string title; public string author; public string subject; public int book_id; };
Books bookA; bookA.title = "The Hitchhiker‘s Guide to the Galaxy"; bookA.author = "DouglasAdams"; bookA.subject = "Since"; bookA.book_id = 424242; Books bookB; bookB.author = "undefined"; //Console.WriteLine($"《{bookB.title}》 are {bookB.subject} subject written by{bookB.author}"); //结构体不使用New的话无法直接调用属性 , 属性值赋值完才可以调用,有默认空构造函数 Console.WriteLine($"《{bookA.title}》 are {bookA.subject} subject written by{bookA.author}");
《The Hitchhiker‘s Guide to the Galaxy》 are Since subject written byDouglasAdams
C# 结构的特点
您已经用了一个简单的名为 Books 的结构。在 C# 中的结构与传统的 C 或 C++ 中的结构不同。C# 中的结构有以下特点:
- 结构可带有方法、字段、索引、属性、运算符方法和事件。
- 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。
- 与类不同,结构不能继承其他的结构或类。
- 结构不能作为其他结构或类的基础结构。
- 结构可实现一个或多个接口。
- 结构成员不能指定为 abstract、virtual 或 protected。
- 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
- 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
类 vs 结构
类和结构有以下几个基本的不同点:
- 类是引用类型,结构是值类型。
- 结构不支持继承。
- 结构不能声明默认的构造函数。
- 结构体中声明的字段无法赋予初值,类可以
- 类的对象是存储在堆空间中,结构存储在栈中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快
针对上述讨论,让我们重写前面的实例:
Books bookC = new Books(); bookC.initValue("Dawn Blossoms Plucked at Dusk", "LuXun", "Collection of essays"); bookC.showDetail(); struct Books { public string title; public string author; public string subject; public int book_id; public void initValue(params string[] val) { title = val[0]; author = val[1]; subject = val[2]; book_id = (int)DateTime.Now.Ticks; } public void showDetail() { Console.WriteLine($"《{title}》 are {subject} subject written by {author}"); } };
《Dawn Blossoms Plucked at Dusk》 are Collection of essays subject written by LuXun