C# - 结构

本文关键字:结构 | 更新日期: 2023-09-12 17:38:13

在 C# 中,struct是表示数据结构的value 类型数据类型。 它可以包含参数化构造函数、静态构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型。

struct可用于保存不需要继承的小数据值,例如坐标点、键值对和复杂的数据结构。

结构声明

结构是使用 struct 关键字声明的。默认修饰符是结构及其成员的内部修饰符。

下面的示例声明图形的结构Coordinate

Example: Structure

struct Coordinate
{
    public int x;
    public int y;
}

可以使用或不使用 new 运算符创建 struct 对象,这与基元类型变量相同。

Example: Create Structure

struct Coordinate
{
    public int x;
    public int y;
}
Coordinate point = new Coordinate();
Console.WriteLine(point.x); //output: 0  
Console.WriteLine(point.y); //output: 0  

上面,使用 new 关键字创建Coordinate结构的对象。 它调用struct的默认无参数构造函数,将所有成员初始化为指定数据类型的默认值。

如果在不使用关键字的情况下声明struct类型的变量new则它不会调用任何构造函数,因此所有成员都保持未赋值状态。 因此,在访问每个成员之前,必须为每个成员赋值,否则将给出编译时错误。

Example: Create Structure Without new Keyword

struct Coordinate
{
    public int x;
    public int y;
}
Coordinate point;
Console.Write(point.x); // Compile time error  
point.x = 10;
point.y = 20;
Console.Write(point.x); //output: 10  
Console.Write(point.y); //output: 20  

结构中的构造函数

struct不能包含无参数构造函数。它只能包含参数化构造函数或静态构造函数。

Example: Parameterized Constructor in Struct

struct Coordinate
{
    public int x;
    public int y;
    public Coordinate(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}
Coordinate point = new Coordinate(10, 20);
Console.WriteLine(point.x); //output: 10  
Console.WriteLine(point.y); //output: 20  

必须在参数化构造函数中包含struct的所有成员,并将参数分配给成员;否则,如果任何成员仍未分配,C# 编译器将给出编译时错误。

结构中的方法和属性

struct可以包含属性、自动实现的属性、方法等,与类相同。

Example: Methods and Properties in Struct

struct Coordinate
{
    public int x { get; set; }
    public int y { get; set; }
    public void SetOrigin()
    {
        this.x = 0;
        this.y = 0;
    }
}
Coordinate point = Coordinate();
point.SetOrigin();
Console.WriteLine(point.x); //output: 0  
Console.WriteLine(point.y); //output: 0  

以下struct包括静态方法。

Example: Static Constructor in Struct

struct Coordinate
{
    public int x;
    public int y;
    public Coordinate(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
    public static Coordinate GetOrigin()
    {
        return new Coordinate();
    }
}
Coordinate point = Coordinate.GetOrigin();
Console.WriteLine(point.x); //output: 0  
Console.WriteLine(point.y); //output: 0  

结构中的事件

结构可以包含用于通知订阅者有关某些操作的事件。以下struct包含一个事件。

Example: Event in Structure

struct Coordinate
{
    private int _x, _y;
    public int x 
    {
        get{
            return _x;
        }
        set{
            _x = value;
            CoordinatesChanged(_x);
        }
    }
    public int y
    {
        get{
            return _y;
        }
        set{
            _y = value;
            CoordinatesChanged(_y);
        }
    }
    public event Action<int> CoordinatesChanged;
}

上面的结构包含CoordinatesChanged event,当xy坐标发生变化时会引发。 下面的示例演示如何处理 CoordinatesChanged 事件。

Example: Handle Structure Events

class Program
{
    static void Main(string[] args)
    {
        Coordinate point = new Coordinate();
        
        point.CoordinatesChanged += StructEventHandler;
        point.x = 10;
        point.y = 20;
    }
    static void StructEventHandler(int point)
    {
        Console.WriteLine("Coordinate changed to {0}", point);
    }
}

struct 是一种值类型,因此它比类对象更快。每当只想存储数据时,请使用结构。通常,结构适用于游戏编程。但是,传输类对象比传输结构更容易。因此,当您通过网络或将数据传递到其他类时,不要使用结构。

总结

  • struct可以包括构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型。
  • struct不能包含无参数构造函数或析构函数。
  • struct可以实现接口,与类相同。
  • struct不能继承另一个结构或类,也不能是类的基。
  • struct成员不能指定为抽象、密封、虚拟或受保护。