感谢大家。在花了一些时间研究之后,我想补充一些可能对某人有所帮助的观点。
免责声明:(以下几点来自(甚至粘贴)codeproject 和其他此类网站。
1) 每个类只能有一个静态构造函数。
原因:静态构造函数必须是无参数的或简单的,不允许构造函数重载。由于 CLR 将调用此构造函数,因此我们无法控制将值传递给此函数。由于我们不能直接调用静态构造函数,因此拥有多个静态构造函数是没有意义的。
class Test
{
static Test() {...}
static Test(int a) {...} //would throw error as "Static constructor must be parameter less"
}
2) 静态构造函数的声明应该没有任何访问说明符。
原因:CLR 将再次调用静态构造函数,而不是类的任何对象。因此,我们不需要任何访问说明符。
3) 静态构造函数只能操作该类的静态变量
原因:非静态成员特定于对象实例。修改其值依赖/绑定到其特定对象实例的变量是没有意义的。
4) 为什么要使用静态构造函数?给我一个很好的例子
原因:您可以使用静态构造函数,例如当您想要记录您将使用该类执行的操作时。MSDN 说“静态构造函数的典型用途是当类使用日志文件并且构造函数用于将条目写入该文件时”。
5) 何时调用静态构造函数?
答:用户无法控制程序中何时执行静态构造函数。.正如其他人和 MSDN 指出的那样,“在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。”
6)在C#中使用基类和派生类时,在创建派生类的新实例时,是先调用基类构造函数还是先调用派生类构造函数?
答:首先调用基类构造函数,然后调用派生类构造函数。
代码示例
class DerivedClass : ParentClass
{
public DerivedClass()
{
Console.WriteLine("Derived class constructor!");
}
}
class ParentClass
{
public ParentClass()
{
System.Console.WriteLine("Parent class constructor!");
}
}
class Program
{
static void Main(string[] args)
{
var a = new DerivedClass(); //Implicitly Typed local variables.
}
}
7)为什么在你上面的例子中,两个构造函数都有公共访问说明符?如果我指定私有或根本不指定访问说明符怎么办?
答:当你没有指定访问说明符时(这种情况下,构造函数自动变为私有)或者当你使用私有访问说明符时,类不能被实例化。每当一个类包含一个或多个私有构造函数时,它严格(!)不能被实例化。这种类型的构造函数称为特殊实例构造函数,一般在类的所有成员都是静态方法时使用。(可能数学课应该是一个很好的例子。)
**8)关于继承的奖金问题。一个类是否继承自两个不同的类?
严格来说没有。C# 只支持直接继承,当然你也可以使用接口。例如,
interface Test
{
void abc();
}
class DerivedClass : ParentClass, Test //Test should not be a class. It can be a interface.
{
public DerivedClass()
{
Console.WriteLine("Derived class constructor!");
}
public void abc()
{
//should be publicly defined!
//non public method could not implement from interface Test
}
}
class ParentClass
{
public ParentClass()
{
System.Console.WriteLine("Parent class constructor!");
}
}