• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

C#教程12结构

武飞扬头像
无水先生
帮助1

一、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.  
     
  4.  
    public struct Point
  5.  
    {
  6.  
    private int x;
  7.  
    private int y;
  8.  
     
  9.  
    public Point(int x, int y)
  10.  
    {
  11.  
    this.x = x;
  12.  
    this.y = y;
  13.  
    }
  14.  
     
  15.  
    public override string ToString()
  16.  
    {
  17.  
    return $"Point x:{x}, y:{y}";
  18.  
    }
  19.  
    }
学新通

        该示例创建一个点结构。这个点也可以用一个类来表示,但是使用 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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfkcji
系列文章
更多 icon
同类精品
更多 icon
继续加载