尽管覆盖了结构默认构造函数,仍然可以使用它

时间:2013-11-03 08:42:29

标签: c# struct

我有以下代码:

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);
        } 
    }

这段代码很好用。为什么?覆盖默认构造函数是否未应用于结构体? 使用参数化构造函数是否覆盖了默认构造函数?

4 个答案:

答案 0 :(得分:3)

您没有覆盖默认构造函数;你刚刚提供了一个接受一个参数的重载。与类不同,为结构体提供参数化构造函数并不意味着不会自动生成默认构造函数。 C#编译器自动为结构提供一个默认的无参数构造函数,它不允许你用自己的结构覆盖它。这只是结构的本质。

来自Using Structs (C# Programming Guide)

  

为结构定义默认(无参数)构造函数是错误的。初始化结构体中的实例字段也是一个错误。您只能通过使用参数化构造函数或在声明结构后单独访问成员来初始化struct成员。任何私有或其他无法访问的成员只能在构造函数中初始化。

如果您真的想要求您的数据类型的用户调用自定义构造函数,则必须使用类。

答案 1 :(得分:1)

http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx

  

结构不能包含显式无参数构造函数。 Struct成员会自动初始化为其默认值

一些很好的解释 Why can't I define a default constructor for a struct in .NET?

答案 2 :(得分:1)

结构将始终具有默认的无参数构造函数,您无法覆盖它。 MSDN解释了一点。这个(和其他)限制是因为结构是值类型。如果您需要像对象一样使用它们,请使用对象:)

答案 3 :(得分:0)

在您的代码中,您不是在调用您创建的构造函数,而是调用默认构造函数。

要调用您覆盖的构造函数,请尝试以下代码:

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'
    } 
}