猿教程 Logo

C# 结构

我们在前面的章节中学习了类。 类是引用类型。 C#包括一个值类型实体,称为结构。 结构是一种可以包含构造函数,常量,字段,方法,属性,索引器,操作符,事件和嵌套类型的值类型。 可以使用struct关键字定义结构。

C#结构案例:

public struct Discounts
{
    public int Cloths { get; set; }
    public int HomeDecor { get; set; }
    public int Grocery { get; set; }
}

可以使用new关键字来初始化结构,也可以不使用new来初始化。 然后,您可以向结构的成员分配值,如下所示。

初始化结构实例:

Discounts saleDiscounts;
saleDiscounts.Cloths = 10;
saleDiscounts.HomeDecor = 5;
saleDiscounts.Grocery = 2;

结构是一个值类型,因此它比类对象更快。 使用struct只要你想只存储数据。 一般来说结构体对游戏编程是有好处的。 但是,传递类对象比结构更容易。 因此,当你通过数据跨线或其他类传递数据时,不要使用struct。

案例:

struct Point
{
    private int _x, _y;
    public int x, y;
    public static int X, Y;
    public int XPoint {
        get 
        {
              return _x;
        }
        set 
        {
            _x = value;
            PointChanged(_x);
        }
    }
    public int YPoint
    {
        get
        {
            return _y;
        }
        set
        {
            _y = value;
            PointChanged(_y);
        }
    }
    public event Action<int> PointChanged;
    public void PrintPoints()
    {
        Console.WriteLine(" x: {0}, y: {1}", _x, _y);
    }
    public static void StaticMethod()
    {
        Console.WriteLine("Inside Static method");
    }
}

上述结构由不同类型的属性和事件组成,用于演示目的。 它包括私有字段_x,_y,公共字段x和y,静态字段X和Y,公共属性XPoint和YPoint和PointChanged事件。 它还包括静态和非静态方法。 注意,当XPoint或YPoint发生变化时,我们都会抛出PointChanged事件。

在下面的代码中,我们使用new关键字初始化上述Point结构体,这是因为我们初始化了类并且还处理了PointChanged事件:

class Program
{
    static void StructEventHandler(int point)
    {
        Console.WriteLine("Point changed to {0}", point);
    }
    static void Main(string[] args)
    {
        Point.StaticMethod();
        Point p = new Point();
        
        p.PointChanged += StructEventHandler;
        p.XPoint = 123;
        
        p.PrintPoints();
    }
}

输出结果:

Inside Static Method
Point changed to 123
X: 123, y: 0

请注意,如果要使用属性,方法或事件,您必须使用new关键字初始化结构。 以下将给出编译时错误:

Point pto;
pto.XPoint = 100; // compile time error

C#结构的特点

  1. 结构可以包括构造函数,常量,字段,方法,属性,索引器,操作符,事件和嵌套类型。

  2. 结构不能包括默认构造函数或析构函数。

  3. 结构可以实现接口。

  4. 结构不能继承另一个结构或类。

  5. 结构成员不能指定为抽象,虚拟或受保护。

  6. 结构必须使用new关键字初始化,以便使用它的属性,方法或事件。


C#结构与类的区别

  1. 类是引用类型,而struct是值类型

  2. Struct不能声明一个默认的构造函数或析构函数。 但是,它可以有参数化构造函数。

  3. 可以在没有new关键字的情况下实现struct。 但是,如果这样做,您将无法使用其任何方法,事件或属性。

  4. Struct不能用作基类,也不能导出另一个结构或类。

要点
  1. 结构是一个值类型,并使用struct关键字定义。

  2. 可以使用或不使用new关键字初始化结构。

  3. 必须使用new关键字初始化结构以使用其“属性,方法和事件”。


更多阅读

  1. Eric Lippert's blog on struct

  2. 如何选择使用类还是结构



版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CSharp/Csharp-structure.html