Ted*_*erz 3 c# constructor initialization
注意:我在这里使用.NET 3.5.
假设我有以下构造函数的示例基类/子类:
public Person(string name, int age, string job, bool isMale)
{
Name = name;
Age = age;
Job = job;
IsMale = isMale;
}
public CollegeStudent(string name) : this(name, 18) {}
public CollegeStudent(string name, int age) : this(name, age, "Student") {}
public CollegeStudent(string name, int age, string job) : this(name, age, job, true) {}
public CollegeStudent(string name, int age, string job, bool isMale) : base(name, age, job, isMale) {}
Run Code Online (Sandbox Code Playgroud)
编译器是否足够聪明,可以看到子构造函数正在做的唯一事情是相互链接并最终只调用基本构造函数?那么,它可以只更改"this"构造函数初始值设定项,以便在编译时直接调用基础构造函数?
所以它本质上会改变所有内容:
public CollegeStudent(string name) : base(name, 18, "Student", true) {}
public CollegeStudent(string name, int age) : base(name, age, "Student", true) {}
public CollegeStudent(string name, int age, string job) : base(name, age, job, true) {}
public CollegeStudent(string name, int age, string job, bool isMale) : base(name, age, job, isMale) {}
Run Code Online (Sandbox Code Playgroud)
我想编写类似于第一部分的构造函数,因为它很方便,但我可能只是直接为每个构造函数调用基础构造函数,如果我只是要产生无用的开销.
C#编译器将向后沿着链接构造函数的行向下移动,直到它到达构造函数Object.我不认为在链接构造函数方面有很多优化,因为您正在使用它们.为了了解自己,您可以尝试编译该代码,然后使用Reflector来查看优化的代码.
在那之前,我等待Jon Skeet.
编辑
我只是将这个简单的代码编译成一个类(.Net 3.5):
namespace Person {
public class Person {
private String Name;
private int Age;
private String Job;
private Boolean IsMale;
public Person(string name, int age, string job, bool isMale) {
Name = name;
Age = age;
Job = job;
IsMale = isMale;
}
}
public class CollegeStudent : Person {
public CollegeStudent(string name) : this(name, 18) { }
public CollegeStudent(string name, int age) : this(name, age, "Student") { }
public CollegeStudent(string name, int age, string job) : this(name, age, job, true) { }
public CollegeStudent(string name, int age, string job, bool isMale) : base(name, age, job, isMale) { }
}
}
Run Code Online (Sandbox Code Playgroud)
使用Reflector,我发现C#编译器没有按照你建议的方式优化任何构造函数.
如果有什么要优化它,它应该是JIT编译器,而不是C#编译器.特别是,如果从不同的程序集调用它,则C#编译器不能假定CollegeStudent中的代码在执行时与编译时的代码相同.
正如SimpleCoder和Jim所说,你不应该过多担心这一点.它成为重大性能问题的可能性微乎其微.
作为马赫什说,用C#4你可以使用可选参数的单个构造函数,但你应该知道,即使你的目标.NET 2.0或.NET 3.5,任何人编译反对用C#2或C#3编译器韩元"你的代码能够使用某些参数是可选的这一事实,并将强制指定所有这些参数.