码迷,mamicode.com
首页 > Windows程序 > 详细

C# 构造器总结

时间:2018-01-23 14:26:42      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:值类型   double   nbsp   字段   intern   初始化   派生   基类   sealed   

   在C#中,构造器分为实例构造器和类型构造器,

       一、实例构造器

       构造引用类型的对象时,在调用实例 构造器之前,为对象分配的内存总是归0,没有被构造器显示重写的字段都保证获得0或null的值

      在一个类中,如果我们没有显示的定义任何构造器,那么C#编译器将定义一个默认的无参构造器,这个无参构造器会简单的调用一个基类的无参构造器,如下面SomeType类

public class SomeType
    {
        public SomeType() : base() { }
    }

    但是当我们基类中没有提供无参构造器怎么办呢,那么这时我们的派生类就必需显示的调用一个基类的构造器,否则编译器会报错。如果类的修饰符为static,编译器根本不会在类的定义中生成默认构造器。

在一个类型中我们是可以定义多个实例构造器的,但是每个构造器必须有不同的签名。

    接下来我们再来谈谈实例构造器的执行,请看如下代码:

internal sealed class SomeType
    {
        private int m_x = 5;
    }

   当我们构造SomeType类时,它的m_x字段被初始化为5,这是因为SomeType的构造器把5存储到字段m_x,再调用基类的构造器,最后调用了自己的构造器。如果你还不懂,请看下面这段代码:

internal sealed class SomeType
    {
        private int m_x = 5;
        private double m_d = 3.1415;
private byte m_b;
public SomeType(string s) { m_d = 10; } }

当我们实例化类型时调用了SomeType(string s)这个构造器时,编译器生成的代码首先会初始化m_x、m_b和m_d的值,再调用基类的构造器,这里的基类就是object,最后再执自己的代码,所以最后三个字段的值为m_x = 5,m_d =10,m_b=0;

说完了引用类型的实例构造器,我们再来谈谈值类型的构造器,个人认为值类型的构造器没有这么重要,只要记得几点就行:

1、CLR确实允许为值类型定义构造器,可以调用构造器来初始化值类型的字段,但必须显示调用才会执行。

2、C#编译器不允许值类型定义无参构造器,但是CLR允许,也就是说,我们可以使用另一种语言定义带有无参构造器的值类型。

       二、类型构造器

     除了实例构造器,CLR还支持类型构造器,也叫静态构造器、类构造器或者类型初始化器。

   1、类型构造器默认没有定义,如果要定义,只能定义一个

   2、类型构造器永远没有参数

   3、必须标记为static,这也是它与实例构造器的区别

   4、C#自动将其标为私有,用显示标记,否则会报错,之所以私有,是为了防止开发人员调用它,因为它的调用是CLR负责的。

   5、类型构造器中的代码只能访问类型的静态字段,并且它的常规用途就是初始化这些字段。

C# 构造器总结

标签:值类型   double   nbsp   字段   intern   初始化   派生   基类   sealed   

原文地址:https://www.cnblogs.com/zhengwei-cq/p/8335106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!