由于我是构造函数主题的新手,我对我们使用它的原因有一点疑惑?声明构造函数和不声明构造函数之间有什么区别吗?
答案 0 :(得分:3)
构造函数用于初始化类对象。如果您没有声明/定义它,那么将为您创建一个默认构造函数。
答案 1 :(得分:2)
如果您没有声明任何构造函数,编译器将生成没有参数的默认构造函数。
考虑这个课程:
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();
它将生成编译错误。
答案 2 :(得分:2)
声明一个简单地调用基类的公共无参数构造函数的公共无参数构造函数之间没有区别:
public class Test
{
public Test() : base() {}
}
相当于:
public class Test
{
}
编译器为您提供默认构造函数。
(并且base()
部分是隐式的;如果你没有明确地链接到另一个构造函数,编译器会把它视为你试图链接到无参数基类构造函数< SUP> 1 。)
但这并不意味着构造函数没用......你通常会把代码放在那里。通常它会复制参数:
public class Test
{
private readonly string name;
public Test(string name)
{
this.name = name;
}
}
...但构造函数大多可以包含与普通方法相同的代码。值得注意的是,当您的构造函数正在运行时,该对象可能不会被完全初始化,因为派生类的构造函数主体还没有执行。因此,建议不要在构造函数中调用虚方法。
有关实例构造函数的详细信息,请参阅C#5规范的第10.11节,有关默认构造函数的详细信息,请参见第10.11.4节。
1 更具体地说,它会像你写的base()
一样链。如果没有无参数构造函数,但是一个构造函数,其参数都是可选的,那么它将被调用。
答案 3 :(得分:1)
构造函数用于类的许多事情。
如果你想在初始化类的实例时做点什么。
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上搜索。