ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# C# 结构 > 原文: [https://zetcode.com/lang/csharp/structures/](https://zetcode.com/lang/csharp/structures/) C# 教程的这一部分涵盖结构。 ## C# 结构定义 结构是值类型。 该类型由`struct`关键字定义。 结构与类非常相似。 它们在某些方面有所不同。 结构旨在表示轻量级对象,例如`Point`,`Rectangle`,`Color`等。 在许多情况下,结构可能比类更有效。 结构是值类型,并在栈上创建。 注意,像`int`,`bool`,`float`之类的原始数据类型在技术上都是`struct`类型。 所有`struct`类型都继承自`System.ValueType`,并且继承自`System.Object`。 结构从来都不是抽象的,它们总是被隐式密封的。 因此结构类型不支持继承。 因此,不能将`struct`数据成员声明为受保护的。 `struct`定义不允许使用抽象修饰符和密封修饰符。 不允许`struct`声明无参数的构造器。 结构还可以包含构造器,常量,字段,方法,属性,索引器,运算符,事件和嵌套类型。 但是,如果我们需要实现更多这些功能,则可以考虑使用一个类。 结构可以实现接口。 `struct`可以用作`nullable`类型,并且可以分配为空值。 ## 简单结构示例 以下示例创建一个简单的结构。 `Program.cs` ```cs using System; namespace SimpleStructure { 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 String.Format("Point x:{0}, y:{1}", x, y); } } class Program { static void Main(string[] args) { var p = new Point(2, 5); Console.WriteLine(p); } } } ``` 该示例创建一个`Point`结构。 这个点也可以用一个类来表示,但是有了`struct`,我们的效率更高了。 特别是如果我们处理了很多问题。 ```cs public struct Point { ... } ``` 该结构用`struct`关键字声明。 ```cs public override string ToString() { return String.Format("Point x:{0}, y:{1}", x, y); } ``` `struct`类型不支持继承。 但是,我们可以对方法使用`override`关键字,`struct`类型隐式地从中继承。 `ToString()`方法就是这种情况。 ```cs var p = new Point(2, 5); Console.WriteLine(p); ``` 我们创建`Point`结构,并在其上调用`ToString()`方法。 ```cs $ dotnet run Point x:2, y:5 ``` 这是示例的输出。 ## 没有`new`关键字 可以创建不带`new`关键字的`struct`类型的实例。 `Program.cs` ```cs using System; namespace NoNewKeyword { public struct Person { public string name; public int age; } class Program { static void Main(string[] args) { Person p; p.name = "Jane"; p.age = 17; Console.WriteLine("{0} is {1} years old", p.name, p.age); } } } ``` 我们有一个`Person`结构,其中有两个公共成员。 ```cs Person p; ``` 首先,我们声明一个`Person`结构。 ```cs p.name = "Jane"; p.age = 17; ``` 稍后我们用一些数据初始化结构。 ```cs $ dotnet run Jane is 17 years old ``` 这是程序的输出。 ## C# 结构是值类型 结构类型是值类型。 它们是在栈上创建的。 创建值类型时,仅在内存中分配了一个空间来存储值。 值类型的分配将复制该值。 `Program.cs` ```cs using System; namespace ValueTypes { 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 String.Format("{0} is {1} years old", Name, Age); } } class Program { static void Main(string[] args) { var p1 = new Person("Beky", 18); var p2 = p1; Console.WriteLine(p2); p2.Name = "Jane"; p2.Age = 17; Console.WriteLine(p2); Console.WriteLine(p1); } } } ``` 我们有一个带有两个数据成员的`Person`结构。 我们有两个参数的构造器,我们也使用自动属性。 ```cs public string Name { get; set; } public int Age { get; set; } ``` 可以在`struct`类型中使用自动属性。 ```cs var p1 = new Person("Beky", 18); var p2 = p1; ``` 在这里,我们创建一个`struct`。 然后将创建的`struct`分配给另一个`struct`。 我们创建该结构的副本。 ```cs p2.Name = "Jane"; p2.Age = 17; ``` 我们更改第二个结构的数据。 第一个不受影响,因为我们正在处理原始`struct`类型的副本。 ```cs $ dotnet run Beky is 18 years old Jane is 17 years old Beky is 18 years old ``` This is the output of the program. ## 基本类型是结构 像`int`,`float`或`bool`之类的原始数据类型是内部结构。 这不同于 C++ 或 Java 之类的语言。 `Program.cs` ```cs using System; public class PrimitiveTypes { static void Main() { 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()`方法。 ```cs Console.WriteLine(x.GetType()); ``` 我们在浮点值上调用`GetType()`方法。 每个结构都隐式继承自包含`GetType()`方法的`System.ValueType`类。 ```cs $ dotnet run System.Single System.Int32 System.Boolean ``` 这是示例的输出。 我们可以在文档中查找这些类型是结构。 在 C# 教程的这一部分中,我们介绍了结构。