博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
菜鸟谈谈C#中的构造函数和析构函数
阅读量:6500 次
发布时间:2019-06-24

本文共 2388 字,大约阅读时间需要 7 分钟。

本节说明对象的创建、初始化和销毁过程。本节介绍下列主题:

l         类构造函数

l         结构构造函数

l         析构函数

 

类构造函数

本节将讨论三种类构造函数:

类构造函数的类型

注释

实例

用于创建并初始化类的实例。

私有

在类之外不可访问的特殊类型实例构造函数。无法用私有构造函数来实例化类。

静态

在创建第一个实例或引用任何静态成员之前,将自动调用这种构造函数来初始化类。无法直接调用这种构造函数。

备注

       (1) 实例构造函数

       创建新对象时将调用类构造函数,例如:

       Point myPoint = new Point();

       一个类可以有多个构造函数。例如,可以声明一个不带参数的构造函数(如 Point())和一个带参数的构造函数(如 Point(int x, int y))。

       如果类没有构造函数,将自动生成一个默认的无参数构造函数,并使用默认值初始化对象字段(例如,int 将初始化为 0)。

       类构造函数可通过base关键字来调用基类的构造函数,例如:

       public Cylinder(double radius, double height): base(radius, height)

       {

       }

       类构造函数也可通过关键字 this 调用同一个类的另一个构造函数,例如:

       public Point(): this(0,20)

       {

       }

       在前面的示例中,无参数构造函数 Point() 调用了另一个带有两个参数的构造函数,将默认位置初始化为 (0, 20)

 

       (2)私有构造函数

       私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例。例如:

       class NLog

       {

            // Private Constructor:

            private NLog() {}  

            public static double e = 2.71828;

       }

       声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 private(私有)修饰符来清楚地表明该类不能被实例化。

 

       (3)静态构造函数

       静态构造函数用于初始化类。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。

       静态构造函数既没有访问修饰符,也没有参数。

       在创建第一个实例或引用任何静态成员之前(方法或字段),将自动调用静态构造函数来初始化类。

       无法直接调用静态构造函数。静态构造函数也不能访问非静态成员,它只被调用一次

       在程序中,用户无法控制何时执行静态构造函数。

       静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。

 

结构构造函数

       结构构造函数类似于类构造函数,只是存在以下差异:

n         结构不能包含显式的无参数构造函数。结构成员将自动初始化为它们的默认值。

n         结构不能有以下形式的初始值设定项:base (argument-list)

       结构可以声明构造函数,但它们必须带参数。声明结构的默认(无参数)构造函数是错误的。结构成员不能有初始值设定项。总是提供默认构造函数以将结构成员初始化为它们的默认值。

       对于结构,不像类那样存在继承。一个结构不能从另一个结构或类继承。结构不能有以下形式的初始值设定项:base (argument-list)

 

析构函数

       析构函数用于销毁类的实例。

       备注

              不能对结构使用析构函数。只能对类使用析构函数。

              一个类只能有一个析构函数。

              无法继承或重载析构函数。

              无法调用析构函数。它们是被自动调用的。

              析构函数既没有修饰符,也没有参数。例如,下面是类 MyClass 的析构函数的声明:

                     ~ MyClass()

                     {

                          // Cleanup statements.

                     }

       该析构函数隐式地对对象的基类调用 Object.Finalize 方法。这样,前面的析构函数代码被隐式地转换为:

              protected override void Finalize()

              {

                   try

                    {

                        // Cleanup statements.

                }

                   finally

                   {

                        base.Finalize();

                   }

              }

       这意味着对继承链中的所有实例递归地(从派生相近程度最大的到派生相近程度最小的)调用 Finalize 方法。

       程序员无法控制何时调用析构函数,因为这由垃圾回收器决定的。垃圾回收器检查是否存在应用程序不再使用的对象。它认为这些对象符合销毁条件并回收这些对象占用的内存。程序退出时也会调用析构函数。

 

base关键字

       base 关键字用于从派生类中访问基类的成员:

       调用基类上已被其他方法重写或隐藏的方法。

       指定创建派生类实例时应调用的基类构造函数。

       基类访问只能在构造函数、实例方法或实例属性访问器中进行。

       静态方法中使用 base 关键字是错误的。

This 关键字

       this 关键字表示类的当前实例。

       静态成员没有 this 指针。

       访问被相同的名称隐藏的成员。

       如:

              public Employee(string name, string alias)

              {

                   this.name = name;

                   this.alias = alias;

              }

       将this作为参数传递到其他方法。

       如:

       CalcTax(this);

       声明索引器,例如:

       public int this [int param]

       {

      get

      {

         return array[param];

      }

      set

      {

         array[param] = value;

      }

   }

       调用同类中其它的构造函数

       静态方法、静态属性访问器引用 this 是错误的。

转载于:https://www.cnblogs.com/wwwzzg168/p/3571978.html

你可能感兴趣的文章
datatable.load 是post请求吗_Python接口自动化之requests请求封装
查看>>
wdcp mysql版本_升级WDCP的PHP及MYSQL版本
查看>>
mac mysql打不开闪一下_mysql command line client打不开(闪一下消失)的解决办法
查看>>
mysql执行sql文件创建数据库_mysql执行sql文件创建数据库
查看>>
mysql横向合并两个表_mysql 查询两张表 横向合并实现类似full join
查看>>
jsp mysql登录注册视频_Jsp+servlet+Mysql实现注册登录
查看>>
hikariconfig mysql_HikariConfig配置解析
查看>>
mysql批量数据多次查询数据库_mysql数据库批量操作
查看>>
springboot mysql连接超时_SpringBoot连接数据库超时
查看>>
python高并发访问mysql_Python访问MySQL
查看>>
实体自动生成增删改查方法_基于Dapper的开源Lambda扩展,支持分库分表自动生成实体之基础介绍...
查看>>
asp mysql主机_mysql仿asp的数据库操作类
查看>>
django 怎么加权限 静态资源目录_django静态文件配置
查看>>
jquery 乱码 传参_jquery获取URL中参数解决中文乱码问题的两种方法
查看>>
ms sql server mysql_MS SQL Server和MySQL区别
查看>>
mysql druid 多数据源_springboot+druid+mybatis plus的多数据源配置
查看>>
python 发送邮件附件csv_Python 发邮件及邮件附件
查看>>
把mysql数据放hbase_Sqoop将mysql数据导入hbase的血与泪
查看>>
termux配置python安装kali_利用termux安装kali
查看>>
新人python2和python3的区别_python2 和Python3 的区别
查看>>