• C# 静态类


    静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享。

    探究

    public static class StaticTestClass
    {
        public static int n = 0;

        public static void Add()
        {
            n++;
        }
    }
    • 网页 P1.aspx 调用 StaticTestClass.Add(),并在页面上输出 n。
    • 网页 P2.aspx 调用 StaticTestClass.Add(),并在页面上输出 n。
    • 访问者 V1 从客户端 C1 访问 P1.aspx,此时输出为 1。
    • 访问者 V2 从客户端 C2 访问 P2.aspx,此时输出为 2。
    • 访问者 V1 关闭浏览器,重新打开访问 P1.aspx,此时输出为 3。

    只要 StaticTestClass 没有被重新编译,即使 P1.aspx、P2.aspx 被重新编译,每当调用 StaticTestClass.Add(),n 都会在前一个次的基础上加 1。

    原则

    • 静态类中的所有成员必须是静态的。

    静态构造函数

    • 静态类可以有静态构造函数,静态构造函数不可继承。
    • 静态构造函数可以用于静态类,也可用于非静态类。
    • 静态构造函数无访问修饰符、无参数,只有一个 static 标志。
    • 静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。
    • 类与结构的实例比较
    • 类与结构的差别
    • 如何选择结构还是类

    类与结构的示例比较

    结构示例

    public struct Person
    {
        string Name;
        int  height;
        int  weight
       
        public bool overWeight()
        {
            //implement something
        }
    }

    类示例

    public class TestTime
    {
        int hours;
        int minutes;
        int seconds;
       
        public void passtime()
        {
            //implementation of behavior
        }
    }

    调用过程

    public class Test
    {
        public static ovid Main
        {
            Person Myperson=new Person      //声明结构
            TestTime Mytime=New TestTime    //声明类
        }
    }

    从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?

    类与结构的差别

    值类型与引用类型

    结构

    结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型。

    类是引用类型,引用类型在堆上分配地址。

    堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑。

    因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用。

    说明:

    • 虽然结构与类的类型不一样,可是他们的基类型都是对象(object),C# 中所有类型的基类型都是 Object。
    • 虽然结构的初始化也使用了 new 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用。

    继承性

    结构

    不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用 sealed 声明,可是结构是隐式的 sealed。

    完全可扩展的,除非显示的声明 sealed,否则类可以继承其他类和接口,自身也能被继承。

    说明:

    • 虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样。

      例如:结构实现接口

      interface IImage
      {
          void Paint();
      }
       
      struct Picture : IImage
      {
          public void Paint()
          {
               // painting code goes here
          }
         
          private int x, y, z;
         // other struct members
      }

    内部结构

    结构

    • 没有默认的构造函数,但是可以添加构造函数
    • 没有析构函数
    • 没有 abstract 和 sealed(因为不能继承)
    • 不能有 protected 修饰符
    • 可以不使用 new 初始化
    • 在结构中初始化实例字段是错误的

    • 有默认的构造函数
    • 有析构函数
    • 可以使用 abstract 和 sealed
    • 有 protected 修饰符
    • 必须使用 new 初始化

    如何选择结构还是类

    讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:

    • 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。
    • 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
    • 在表现抽象和多级别的对象层次时,类是最好的选择。
    • 大多数情况下该类型只是一些数据时,结构时最佳的选择。

    ----

    网友在 CSDN 上的回答:

    结构可以看作是轻量级的类,在性能上要好一点。

    相同之处:

    • 结构和类对于程序来讲都通过指针操作,同样是面向对象的形式。

    不同之处:

    • 结构体对象总是在线程堆栈上操作,而不是托管堆上。
    • 不能继承一个结构体(所以在调用结构体的方法时不需要查找 vtable: 虚函数继承表)
    • 我们不能声明构造函数为空的结构体(不晓得为啥非得要这么设计)
    • 结构体的构造函数内必须初始化所有变量(不晓得为啥非得要这么设计)
    • 结构体的字段不能有默认值(默认都是二进制意义上的零值),但是可以在构造函数内改变“默认值”

    .....

    按照MSDN上的意思,实际上适合用 struct 的场合很小,结构使用指南:

    • 行为与基元类型一样。
    • 具有 16 字节以下的实例大小。
    • 是不可改变的。
    • 值语义是合意的。

    C# 中结构与类的区别一文中,已经介绍了 struct 的相关知识,本文就结合应用作些强调、补充、修正。

    关于字段

    不能在声明字段时初始化它,除非字段被标明为 const 或 static。

    关于构造函数

    构造函数必须有参数。

    构造函数中必须为所有的字段赋值。

    说明

    不允许在结构中显式地声明无参数的构造函数,若要显示地声明则必须是有参数的。但在使用 new 实例化时可以使用无参数的构造函数,也可以使用有参数的构造函数,说明存在着一个看不到的、默认的无参数构造函数,《C# 中结构与类的区别》一文中说结构“没有默认的构造函数”,这种说法有误。

    要不要使用 new

    如果使用结构中的属性、方法,则必须使用 new,否则可以不使用 new。

    嵌套类型

    在类或结构内部定义的类型称为嵌套类型。例如:

    class Container
    {
        class Nested
        {
            Nested() { }
        }
    }

    不管外部类型是类还是结构,嵌套类型均默认为 private,但是可以设置为 public、protected internal、protected、internal 或 private。在上面的示例中,Nested 对外部类型是不可访问的,但可以设置为 public,如下所示:

    class Container
    {
        public class Nested
        {
            Nested() { }
        }
    }
    

    嵌套类型(或内部类型)可访问包含类型(或外部类型)。若要访问包含类型,请将其作为构造函数传递给嵌套类型。例如:

    public class Container
    {
        public class Nested
        {
            private Container m_parent;
    
            public Nested()
            {
            }
            public Nested(Container parent)
            {
                m_parent = parent;
            }
        }
    }

    嵌套类型可访问包含类型的私有成员和受保护的成员(包括所有继承的私有成员或受保护的成员)。

    在前面的声明中,类 Nested 的完整名称为 Container.Nested。这是用来创建嵌套类的新实例的名称,如下所示:

    Container.Nested nest = new Container.Nested();
  • 相关阅读:
    北京燃气IC卡充值笔记
    随机分析、随机控制等科目在量化投资、计算金融方向有哪些应用?
    量化交易平台大全
    Doctor of Philosophy in Computational and Mathematical Engineering
    Institute for Computational and Mathematical Engineering
    Requirements for the Master of Science in Computational and Mathematical Engineering
    MSc in Mathematical and Computational Finance
    万字长文:详解多智能体强化学习的基础和应用
    数据处理思想和程序架构: 使用Mbedtls包中的SSL,和服务器进行网络加密通信
    31-STM32+W5500+AIR202/302基本控制篇-功能优化-W5500移植mbedtls库以SSL方式连接MQTT服务器(单向忽略认证)
  • 原文地址:https://www.cnblogs.com/nafio/p/9137568.html
Copyright © 2020-2023  润新知