• C#基本语法学习(八)


    C#中的结构

      在C#中用关键字struct定义一个结构。从语法上来看,结构与类很相似,在类中可以包含的成员几乎都可以包含在结构中。例如,结构中可以定义字段、方法、构造函数、属性、事件等。定义结构语法如下:

      访问修饰符 struct 结构名

      {

        //结构成员

      }

      

     1 public struct MyPoint
     2 {
     3     public int x;
     4     public int y;
     5 
     6     public MyPoint(int a, int b)
     7     {
     8         x = a;
     9         y = b;
    10     }
    11 }

      在结构中不能定义默认构造函数(即不带参数的构造函数),但可以定义带参数的构造函数,如上面代码定义的结构,定义了带参数的构造函数。

      定义了结构后就可以在代码中使用,使用结构的方法可以与使用类的方法相同用new关键字创建结构,并调用适当的构造函数;同时与类不同的是,结构的实例化可以不使用 new 运算符。 在此情况下不存在构造函数调用,

      因而可以提高分配效率。 但是,在初始化所有字段之前,字段将保持未赋值状态且对象不可用。

    1             MyPoint p1 = new MyPoint();
    2             MyPoint p2 = new MyPoint(10, 20);
    3             MyPoint p3;
    4             p3.x = 100;
    5             p3.y = 300;
    6 
    7             Console.WriteLine("p1.x = {0}, p1.y = {1}", p1.x, p1.y);
    8             Console.WriteLine("p2.x = {0}, p2.y = {1}", p2.x, p2.y);
    9             Console.WriteLine("p3.x = {0}, p3.y = {1}", p3.x, p3.y);

      结果如下

    p1.x = 0, p1.y = 0
    p2.x = 10, p2.y = 20
    p3.x = 100, p3.y = 300

      对于结构,不像类那样存在继承。 一个结构不能从另一个结构或类继承,而且不能作为一个类的基。 但是,结构从基类 Object 继承。 结构可实现接口,其方式同类完全一样。

      类是一种引用类型。所谓引用类型,是指变量所包含的是实际数据的地址。而结构是一种值类型,即变量所包含的是实际的数据。引用类型的存储空间是在堆上分配的,依赖垃圾回收机制释放所占内存;值类型的存储空间是在堆栈上分配的,当变量

      超出作用域时立即释放。

      用以下代码来说明类引用类型和结构值类型的区别

     1             Console.WriteLine("定义结构p1");
     2             MyPoint p1 = new MyPoint(10, 10);
     3             Console.WriteLine("把p1结构赋值给另外两个结构p2和p3");
     4             MyPoint p2 = p1;
     5             MyPoint p3 = p1;
     6 
     7             Console.WriteLine("修改p2结构的值");
     8             p2.x = 100;
     9             p2.y = 300;
    10 
    11             Console.WriteLine("修改后结构p1,p2,p3的值分别为:");
    12             Console.WriteLine("p1.x = {0}, p1.y = {1}", p1.x, p1.y);
    13             Console.WriteLine("p2.x = {0}, p2.y = {1}", p2.x, p2.y);
    14             Console.WriteLine("p3.x = {0}, p3.y = {1}", p3.x, p3.y);
    15 
    16 
    17             Console.WriteLine("定义类p11");
    18             MyPointClass p11 = new MyPointClass(10, 10);
    19             Console.WriteLine("把p11类实例赋值给另外两个类p22和p33");
    20             MyPointClass p22 = p11;
    21             MyPointClass p33 = p11;
    22 
    23             Console.WriteLine("修改p22类实例的值");
    24             p22.x = 100;
    25             p22.y = 300;
    26 
    27             Console.WriteLine("修改后类实例p11,p22,p33的值分别为:");
    28             Console.WriteLine("p11.x = {0}, p11.y = {1}", p11.x, p11.y);
    29             Console.WriteLine("p22.x = {0}, p22.y = {1}", p22.x, p22.y);
    30             Console.WriteLine("p33.x = {0}, p33.y = {1}", p33.x, p33.y);

      运行结果

    定义结构p1
    把p1结构赋值给另外两个结构p2和p3
    修改p2结构的值
    修改后结构p1,p2,p3的值分别为:
    p1.x = 10, p1.y = 10
    p2.x = 100, p2.y = 300
    p3.x = 10, p3.y = 10
    定义类p11
    把p11类实例赋值给另外两个类p22和p33
    修改p22类实例的值
    修改后类实例p11,p22,p33的值分别为:
    p11.x = 100, p11.y = 300
    p22.x = 100, p22.y = 300
    p33.x = 100, p33.y = 300

      由于以上原因,相对于类来说,结构是一种轻量级的数据类型,适用于表示占用存储空间较小的数据类型。如果一个数据类型具有以下几个特点,则可以将其定义为结构:

        1、在逻辑上表示单个值,与基元类型(int、double等)类似

        2、占用内存小于16字节

        3、不必频繁转换为引用类型

      用以下代码测试类与结构的效率

     1             DateTime time1 = DateTime.Now;
     2             Console.WriteLine("创建999999999个结构,开始于" + time1.ToLongTimeString());
     3             for (int i = 0; i < 999999999; i++)
     4             {
     5                 MyPoint p = new MyPoint(10, 10);
     6             }
     7             DateTime time2 = DateTime.Now;
     8             Console.WriteLine("创建999999999个结构,结束于:" + time2.ToLongTimeString());
     9             Console.WriteLine("共耗时: {0}", time2 - time1);
    10 
    11             time1 = DateTime.Now;
    12             Console.WriteLine("创建999999999个类,开始于:" + time1.ToLongTimeString());
    13             for (int i = 0; i < 999999999; i++)
    14             {
    15                 MyPointClass p = new MyPointClass(10, 10);
    16             }
    17             time2 = DateTime.Now;
    18             Console.WriteLine("创建999999999个类,结束于:" + time2.ToLongTimeString());
    19             Console.WriteLine("共耗时: {0}", time2 - time1);

      运行结果如下

    创建999999999个结构,开始于17:20:35
    创建999999999个结构,结束于:17:20:39
    共耗时: 00:00:04.0582321
    创建999999999个类,开始于:17:20:39
    创建999999999个类,结束于:17:20:47
    共耗时: 00:00:07.6894398

      可以看出创建结构要比创建类花的时间少。

      

  • 相关阅读:
    javascript Date类的扩展
    软件工程师好了歌 (转)
    您可能不知道的.Net2.0小技巧
    您未必知道的Js技巧
    复活吧,架构师!
    技巧系列文章
    不要使用paddingtop控制内容开始的位置
    JQuery Offset实验与应用(转载)
    2008最佳Windows应用程序
    精选15个国外CSS框架
  • 原文地址:https://www.cnblogs.com/numbqq/p/5292953.html
Copyright © 2020-2023  润新知