我有以下代码:
struct Person
{
public readonly int x;
public Person( int x )
{
this.x = x;
}
}
class Program
{
static void Main(string[] args)
{
Person p = new Person();
Console.Write(p.x);
}
}
此代码运行良好。为什么?重写默认构造函数是否未应用于结构?使用参数化构造函数是否覆盖了默认构造函数?
您没有覆盖默认构造函数;您刚刚提供了一个接受一个参数的重载。与类不同,结构的参数化构造函数并不意味着默认构造函数不会自动生成。C#编译器自动为结构提供一个默认的无参数构造函数,并且不允许您用自己的构造函数覆盖它。这就是structs的本质。
从使用结构(C#编程指南(
为结构定义默认(无参数(构造函数是错误的。初始化结构体中的实例字段也是一个错误。只能通过使用参数化构造函数或在声明结构后单独访问结构成员来初始化结构成员。任何私有或不可访问的成员只能在构造函数中初始化。
如果您真的想要求您的数据类型的用户调用自定义构造函数,则必须使用类。
结构将始终有一个默认的无参数构造函数,您不能覆盖它。MSDN对此做了一些解释。存在这种(和其他(限制是因为结构是值类型。如果您需要像使用对象一样使用它们,请使用对象:(
http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx
结构不能包含显式无参数构造函数。结构成员自动初始化为其默认值
一些很好的解释为什么可以';t我在中为结构定义了一个默认构造函数。NET?
在您的代码中,您不是在调用您创建的构造函数,而是在调用默认构造函数。
要调用您重写的构造函数,请尝试以下代码:
struct Person
{
public readonly int x;
public Person( int x )
{
this.x = x;
}
}
class Program
{
static void Main(string[] args)
{
int v = 9;
Person p = new Person(v);
Console.Write(p.x); // will output '9'
}
}