开放的编程资料库

当前位置:我爱分享网 > C#教程 > 正文

C# 结构

在本文中,我们使用C#中的结构类型。

结构类型

结构是一种值类型。该类型是用struct关键字定义的。结构类似于类。结构旨在表示轻量级对象,例如PointRectangleColor等。在许多情况下,结构可能比类更有效。结构是值类型,是在堆栈上创建的。请注意,intboolfloat等原始数据类型在技术上属于struct类型。

所有struct类型都继承自System.ValueType并进一步继承自System.Object。结构从来都不是抽象的,它们总是隐式密封的。所以结构类型不支持继承。因此,不能将struct数据成员声明为受保护。struct定义不允许使用abstract和sealed修饰符。struct不允许声明无参数构造函数。

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

C#结构简单示例

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

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}";
    }
}

该示例创建了一个Point结构。点也可以用一个类来表示,但是使用struct我们效率更高;尤其是当我们处理很多点时。

var p = new Point(2, 5);
Console.WriteLine(p);

我们创建Point结构并调用它的ToString方法。

public struct Point
{
    ...
}

结构是用struct关键字声明的。

public override string ToString()
{
    return $"Point x:{x}, y:{y}";
}

struct类型不支持继承。但是我们可以对方法使用override关键字,struct类型从中隐式继承。ToString方法就是这种情况。

$ dotnet run
Point x:2, y:5

没有新关键字

可以在不使用new关键字的情况下创建struct类型的实例。

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结构。

Person p;

首先我们声明一个Person结构。

p.name = "Jane";
p.age = 17;

稍后我们用一些数据初始化结构。

$ dotnet run
Jane is 17 years old

C#struct自动实现的属性

我们可以将自动实现的属性与结构类型一起使用。

var p1 = new Person("John Doe", "gardener");
Console.WriteLine(p1);

var p2 = new Person("Roger Roe", "driver");
Console.WriteLine(p2);

public struct Person
{
    public Person(string name, string occupation)
    {
        this.Name = name;
        this.Occupation = occupation;
    }

    public string Name { get; set; }
    public string Occupation { get; set; }

    public override string ToString()
    {
        return $"{Name} is a(n) {Occupation}";
    }
}

在程序中,我们有一个Person结构类型,它具有自动实现的NameOccupation属性。

public string Name { get; set; }
public string Occupation { get; set; }

getset关键字用于创建自动实现的属性。我们有更简洁易读的代码。

C#只读结构

使用readonly修饰符,我们可以创建一个不可变的结构类型。只读结构的所有成员都必须是只读的。字段成员也可以使用readonly修饰符,而自动属性也可以使用init关键字。

var p = new Point(3, 7);
Console.WriteLine(p);

public readonly struct Point
{
    public Point(double x, double y)
    {
        X = x;
        Y = y;
    }

    public double X { get; init; }
    public double Y { get; init; }

    public override string ToString()
    {
        return $"({X}, {Y})";
    }
}

在示例中,我们创建了一个点。Point结构有两个只读属性:XY

public double X { get; init; }
public double Y { get; init; }

init关键字创建一个init-onlysetter。它仅在对象构建期间为属性赋值。这加强了不变性。

C#结构是值类型

结构类型是值类型。它们是在堆栈上创建的。创建值类型时,仅分配内存中的一个空间来存储该值。值类型的赋值会复制该值。

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;

这里我们创建了一个struct。然后将创建的struct分配给另一个struct。我们创建结构的副本。

p2.Name = "Jane";
p2.Age = 17;

我们更改第二个结构的数据。第一个不受影响,因为我们处理原始struct类型的副本。

public string Name { get; set; }
public int Age { get; set; }

自动属性可用于struct类型。

$ dotnet run
Beky is 18 years old
Jane is 17 years old
Beky is 18 years old

原始类型是结构

intfloatbool等原始数据类型是底层结构。这不同于C++或Java等语言。

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

在本文中,我们介绍了C#中的结构类型。

列出所有C#教程。

未经允许不得转载:我爱分享网 » C# 结构

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏