• C#教程12:结构


    一、C# 结构

            在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。

            结构体是用来代表一个记录。假设您想跟踪图书馆中书的动态。您可能想跟踪每本书的以下属性:

    • Title
    • Author
    • Subject
    • Book ID

            以下介绍对于书这种含多个属性的数据如何定义。 

    二、定义结构体

            为了定义一个结构体,您必须使用 struct 语句。struct 语句为程序定义了一个带有多个成员的新的数据类型。例如,您可以按照如下的方式声明 Book 结构:

    1. struct Books
    2. {
    3. public string title;
    4. public string author;
    5. public string subject;
    6. public int book_id;
    7. };

            结构是一种值类型。类型使用 struct 关键字定义。结构与类非常相似;它们在某些方面有所不同。结构旨在表示轻量级对象,如点、矩形、颜色等。在许多情况下,结构可能比类更有效。结构是值类型并在堆栈上创建。请注意,int、bool、float 等原始数据类型在技术上属于结构类型。

            结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型。但是,如果我们需要实现更多这些功能,我们可能会考虑使用一个类来代替。

            结构可以实现接口。结构可以用作可空类型,并且可以分配空值。

    三、简单的结构案例

    下面的示例创建一个简单的结构。

    Program.cs

    1. var p = new Point(2, 5);
    2. Console.WriteLine(p);
    3. public struct Point
    4. {
    5. private int x;
    6. private int y;
    7. public Point(int x, int y)
    8. {
    9. this.x = x;
    10. this.y = y;
    11. }
    12. public override string ToString()
    13. {
    14. return $"Point x:{x}, y:{y}";
    15. }
    16. }

            该示例创建一个点结构。这个点也可以用一个类来表示,但是使用 struct 我们效率更高;特别是,如果我们处理了很多点。

    1. var p = new Point(2, 5);
    2. 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

    四、定义时可以不用 new 关键词

            可以在没有新关键字的情况下创建结构类型的实例。

    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
  • 相关阅读:
    Azkaban环境配置-尚硅谷大数据培训
    Java网络编程——NIO处理写事件(SelectionKey.OP_WRITE)
    抖音矩阵系统独立定制部署。look
    《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3 Enhancement
    Web学习day04
    判断 async/await 是否对性能产生了负面影响
    Node.js 应用程序的 Docker 安全最佳实践
    Docker从初学到进阶二(使用Docker命令,自定义镜像,部署微服务集群,配置自己的镜像仓库)
    OpenMV:23串口发送数据
    实验五 循环结构(长沙理工大学)
  • 原文地址:https://blog.csdn.net/gongdiwudu/article/details/123445876