在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。
结构体是用来代表一个记录。假设您想跟踪图书馆中书的动态。您可能想跟踪每本书的以下属性:
以下介绍对于书这种含多个属性的数据如何定义。
为了定义一个结构体,您必须使用 struct 语句。struct 语句为程序定义了一个带有多个成员的新的数据类型。例如,您可以按照如下的方式声明 Book 结构:
- struct Books
- {
- public string title;
- public string author;
- public string subject;
- public int book_id;
- };
结构是一种值类型。类型使用 struct 关键字定义。结构与类非常相似;它们在某些方面有所不同。结构旨在表示轻量级对象,如点、矩形、颜色等。在许多情况下,结构可能比类更有效。结构是值类型并在堆栈上创建。请注意,int、bool、float 等原始数据类型在技术上属于结构类型。
结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型。但是,如果我们需要实现更多这些功能,我们可能会考虑使用一个类来代替。
结构可以实现接口。结构可以用作可空类型,并且可以分配空值。
下面的示例创建一个简单的结构。
Program.cs
- var p = new Point(2, 5);
- Console.WriteLine(p);
-
- public struct Point
- {
- private int x;
- private int y;
-
- public Point(int x, int y)
- {
- this.x = x;
- this.y = y;
- }
-
- public override string ToString()
- {
- return $"Point x:{x}, y:{y}";
- }
- }
该示例创建一个点结构。这个点也可以用一个类来表示,但是使用 struct 我们效率更高;特别是,如果我们处理了很多点。
- var p = new Point(2, 5);
- Console.WriteLine(p);
我们创建点结构并调用其 ToString 方法。
public struct Point
{
...
}
该结构使用 struct 关键字声明。
public override string ToString()
{
return $"Point x:{x}, y:{y}";
}
结构类型不支持继承。但是我们可以为方法使用 override 关键字,结构类型从这些方法中隐式继承。 ToString 方法就是这样一种情况。
$ dotnet run
Point x:2, y:5
可以在没有新关键字的情况下创建结构类型的实例。
Program.cs
Person p;
p.name = "Jane";
p.age = 17;
Console.WriteLine($"{p.name} is {p.age} years old");
public struct Person
{
public string name;
public int age;
}
我们有一个包含两个公共成员的人员结构。
Person p;
首先,我们声明一个 Person 结构。
p.name = "Jane"; p.age = 17;
稍后我们用一些数据初始化结构。
$ dotnet run
Jane is 17 years old
结构类型是值类型。它们是在堆栈上创建的。创建值类型时,仅分配内存中的一个空间来存储该值。值类型的赋值复制值。
Program.cs
var p1 = new Person("Beky", 18);
var p2 = p1;
Console.WriteLine(p2);
p2.Name = "Jane";
p2.Age = 17;
Console.WriteLine(p2);
Console.WriteLine(p1);
public struct Person
{
public Person(string name, int age) : this()
{
this.Name = name;
this.Age = age;
}
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return $"{Name} is {Age} years old";
}
}
我们有一个包含两个数据成员的 Person 结构。我们有一个两个参数的构造函数,我们还使用自动属性。
var p1 = new Person("Beky", 18);
var p2 = p1;
在这里,我们创建了一个结构。然后将创建的结构分配给另一个结构。我们创建一个结构的副本。
p2.Name = "Jane"; p2.Age = 17;
我们更改第二个结构的数据。第一个不受影响,因为我们处理的是原始结构类型的副本。
public string Name { get; set; }
public int Age { get; set; }
自动属性可用于结构类型。
$ dotnet run
Beky is 18 years old
Jane is 17 years old
Beky is 18 years old
int、float 或 bool 等原始数据类型是底层结构。这与 C++ 或 Java 等语言不同。
Program.cs
float x = 12.3f; int y = 34; bool z = false; Console.WriteLine(x.GetType()); Console.WriteLine(y.GetType()); Console.WriteLine(z.GetType());
我们有三个变量:float、int 和 bool。我们对它们中的每一个调用 GetType 方法。
Console.WriteLine(x.GetType());
我们在浮点值上调用 GetType 方法。每个结构都隐式继承自包含 GetType 方法的 System.ValueType 类。
$ dotnet run System.Single System.Int32 System.Boolean