# 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# 教程的这一部分中，我们介绍了结构。