我们可以使用另一种语言定义带有无参构造器的值类型

时间:2022-01-20 06:30:10

在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、类型结构器中的代码只能访谒类型的静态字段,并且它的通例用途就是初始化这些字段。