C#中手动无参空构造函数与编译器生成默认构造函数的区别
C#中手动定义无参空构造函数与编译器自动生成构造函数的区别
先看示例代码:
class Constructor { Constructor() { } static void Main() { Constructor obj = new Constructor(); } } class Compiler { Compiler obj1 = new Compiler(); }
针对问题,二者核心区别如下:
访问修饰符不同
手动定义的无参构造函数如果不指定修饰符,默认是private(类成员的默认访问级别),仅当前类内部能实例化该类;而编译器自动生成的默认构造函数,访问级别和类本身一致——类是public则构造为public,类是internal则构造为internal,外部代码可正常实例化。对继承的影响不同
当类显式定义了任意构造函数(包括这个无参空构造),编译器不会给它的子类自动生成默认构造函数,若子类未手动定义构造,编译会报错;而如果父类依赖编译器自动生成默认构造,子类没写构造时,编译器会自动给子类生成默认构造,并在其中调用父类的默认构造。代码意图的明确性不同
手动写出无参构造,相当于明确告知其他开发者:这个类要保留无参实例化的能力,哪怕后续添加带参构造,这个无参构造也不会消失。而编译器自动生成的构造是隐式的,一旦给类添加任意带参构造,这个自动生成的无参构造会立刻消失,容易让未注意到的开发者在实例化时出错。执行逻辑的一致性
排除访问修饰符差异,手动写的空无参构造和编译器自动生成的构造执行逻辑完全一致:都会先完成类中字段的初始化(比如示例里Compiler类的obj1字段初始化),再执行构造函数体(此处均为空)。
内容的提问来源于stack exchange,提问作者Viknesh
相关产品推荐
相关产品推荐

