C#中结构体, C#与类的区别

C#中结构体, C#与类的区别

结构体的声明

  • 不能使用关键字 struct声明一个结构; 可以使用new来声明一个结构

    //CoOrds 是一个结构体
    CoOrds coords1;//直接声明
    CoOrds coords1 = new CoOrds();//使用new关键字, 调用默认构造函数
    CoOrds coords2 = new CoOrds(10, 10);//使用new关键字, 调用参数化构造函数

结构体的实例化

  • 使用默认构造函数参数化构造函数来演示 struct 初始化:

    public struct CoOrds
    {
      public int x, y;
    
      public CoOrds(int p1, int p2)
      {
          x = p1;
          y = p2;
      }
    }
    
    // Declare and initialize struct objects.
    class TestCoOrds
    {
      static void Main()
      {
          // Initialize:   
          CoOrds coords1 = new CoOrds();//使用默认构造函数
          CoOrds coords2 = new CoOrds(10, 10);//使用参数化构造函数
    
          // Display results:
          Console.Write("CoOrds 1: ");//使用默认构造函数, 此时所有成员分配默认值
          Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
    
          Console.Write("CoOrds 2: ");//使用参数化构造函数, 此时成员分配参数
          Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
    
          // Keep the console window open in debug mode.
          Console.WriteLine("Press any key to exit.");
          Console.ReadKey();
      }
    }
    /* Output:
      CoOrds 1: x = 0, y = 0
      CoOrds 2: x = 10, y = 10
    */
    
  • 此示例演示了一个struct特有的功能。 此功能可以创建 CoOrds 对象,而无需使用 new 运算符。 如果将 struct 替换为 class,程序将不会进行编译。

    public struct CoOrds
    {
      public int x, y;
    
      public CoOrds(int p1, int p2)
      {
          x = p1;
          y = p2;
      }
    }
    
    // Declare a struct object without "new."
    class TestCoOrdsNoNew
    {
      static void Main()
      {
          // 声明一个结构体, 字段将保持为未分配状态
          CoOrds coords1;
    
          // 字段必须在初始化所有字段之后才可使用对象
          coords1.x = 10;
          coords1.y = 20;
    
          // Display results:
          Console.Write("CoOrds 1: ");
          Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
    
          // Keep the console window open in debug mode.
          Console.WriteLine("Press any key to exit.");
          Console.ReadKey();
      }
    }
    // Output: CoOrds 1: x = 10, y = 20

结构体的构造函数

  • 如果实例化使用的默认、 无参数构造函数的结构对象时,所有成员都分配根据其默认值
  • 当编写一个结构的参数的构造函数,你必须显式初始化所有成员
  • 对结构进行实例化,不一定要使用 new运算符。 在这种情况下,没有调用任何构造函数,从而提高了分配效率。 但是,字段将保持为未分配状态且必须在初始化所有字段之后才可使用对象。 这包括无法通过getset自动实现属性的值。

结构体的优势

  • struct 类型适用于表示轻量级对象,如 PointRectangleColor
  • 尽管用它来表示一个点就如同具有 Auto-Implemented Properties(自动实现的属性)那样方便,但在某些情况下,使用 结构 可能更高效。 例如,如果你声明具有 1000 个 Point 对象的数组,那么你将分配额外的内存用于引用每个对象;在这种情况下,使用结构将更为低消耗。
  • 除非需要引用类型语义,将较小的类声明为结构,可以提高系统的处理效率。

结构体的继承

  • 一个结构无法继承自另一个结构或类,并且它不能为类的基类。
  • 结构也可以实现接口,且实现方法与类相同。

结构体与类

  • 类是引用类型。 创建类的对象后,向其分配对象的变量仅保留对相应内存的引用; 结构是值类型。 创建结构时,向其分配结构的变量保留结构的实际数据
  • 将对象引用分配给新变量后,新变量会引用原始对象。 通过一个变量所做的更改将反映在另一个变量中,因为它们引用相同的数据; 将结构分配给新变量时,会复制结构。 因此,新变量和原始变量包含相同数据的副本(共两个)。 对一个副本所做的更改不会影响另一个副本。
  • 一般来说,类用于对更复杂的行为或应在类对象创建后数据会进行修改的情况。 结构适用于所含大部分数据不会在结构创建后进行修改的小型数据结构。

猜你喜欢

转载自blog.csdn.net/jingangxin666/article/details/80062571