由于我是构造函数主题的新手,我对我们为什么使用它有点困惑?声明构造函数和不声明它有什么区别吗?
4 回答
构造函数用于初始化类对象。如果您不声明/定义它,那么将为您创建一个默认构造函数。
如果不声明任何构造函数,编译器将生成不带参数的默认构造函数。
考虑这个类:
public Class X
{
public int A { get; set; }
}
那里没有构造函数声明,因此编译器会将默认构造函数放在该类中,如下所示:
public Class X
{
public int A { get; set; }
public X ()
{
}
}
如果在类中声明构造函数,则不会生成默认构造函数。
public Class X
{
public int A { get; set; }
public X (int a)
{
// do something
}
}
在此示例中,不会生成默认的空构造函数。如果您尝试创建这样的实例:
X obj = new X();
它会产生编译错误。
声明一个简单地调用基类的公共无参数构造函数的公共无参数构造函数没有区别:
public class Test
{
public Test() : base() {}
}
相当于:
public class Test
{
}
编译器为您提供了一个默认构造函数。
(并且这base()
部分是隐式的;如果您没有显式链接到另一个构造函数,编译器会将其视为您尝试链接到无参数基类构造函数1。)
但这并不意味着构造函数是无用的……你通常会把代码放在那里。通常它会复制参数:
public class Test
{
private readonly string name;
public Test(string name)
{
this.name = name;
}
}
...但构造函数大多可以包含与普通方法相同的代码。值得注意的是,当您的构造函数运行时,对象可能尚未完全初始化,因为派生类的构造函数主体尚未执行。出于这个原因,建议不要在构造函数中调用虚方法。
有关实例构造函数的一般详细信息,请参阅 C# 5 规范的第 10.11 节,有关默认构造函数的详细信息,请参阅第 10.11.4 节。
1更具体地说,它会像你写的那样链接base()
。如果没有无参数的构造函数,但是有一个参数都是可选的构造函数,就会被调用。
构造函数用于类的许多事情。
如果你想对类实例的初始化做一些事情。
public class MyClass { private string myWork = string.Empty; public MyClass() { myWork = "Started"; } }
如果要限制类的对象创建范围
public class MyClass { private string myWork = string.Empty; protected MyClass() { myWork = "Started"; } }
还有很多其他的东西,比如基类支持等等。也请在 MSDN 上搜索。