Struct中的参数化构造函数

时间:2017-05-04 08:26:12

标签: c#

默认构造函数是为“Class”和“Struct”定义的。但是如果我声明一个只有一个构造函数的类“Point”,并且它也是一个参数化的类,编译器就不允许我写

Point p = new Point()

但是,如果我有一个结构“Point”,它只有1个参数化构造函数,编译器将允许我写

Point p = new Point()

我问的问题是为什么编译器允许struct创建一个对象并停止该类来创建一个对象?

注意:我在C#6上编写此代码

3 个答案:

答案 0 :(得分:0)

因为struct是值类型,所以它的默认值不是null,就像引用类型一样,但是一个实例,其所有成员都设置为默认值。

因此,即使您只允许调用参数化构造函数,您仍然可以创建一个默认实例,这与使用默认构造函数创建结构完全相同。

例如,给定这个结构:

public struct Point
{
    public int X { get; private set; }
    public int Y { get; private set; }

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}

即使你不能这样做:

var p = new Point();

你仍然可以这样做:

var p = default(Point);

如果Point是一个类,这将无法为您提供实例,它会让您null。但是使用结构可以获得一个实例。

因此,没有理由阻止使用默认构造函数,并且假装您无法创建默认实例。

答案 1 :(得分:-1)

您可以在MSDN上找到您的问题(为什么没有编译错误)的答案:

  

在C#中,类和结构在语义上是不同的

https://docs.microsoft.com/en-us/dotnet/articles/csharp/programming-guide/classes-and-structs/using-structs

  

结构体不能声明默认构造函数(没有构造函数)   参数)或析构函数。

https://docs.microsoft.com/en-us/dotnet/articles/csharp/programming-guide/classes-and-structs/structs

  

每个值类型都有一个隐式默认构造函数,用于初始化该类型的默认值。有关默认值的信息   值类型,请参见默认值表。

https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/keywords/value-types

答案 2 :(得分:-1)

使用类时,可以定义是否可以以任何特定方式初始化其对象。 但是,当涉及到struct时,应始终能够在没有参数的情况下进行初始化。

最好的例子是,当你无法以指定的方式初始化类时,可以用null初始化类,而结构体没有这样的选项。但结构可以用default关键字初始化,它基本上调用无参数构造函数。

<强>编辑: 虽然我在概述struct作为valuetype的通用规则,但实际上有几种方法可以使用struct初始化null(或模拟它)。当然,最常见的是Nullable<>,对大多数(如果不是全部)目的而言,这已经足够了。对于那些对其工作原理感到好奇的人以及将null设置为struct的其他方式,我建议 C#in Depth 第4章。说 Jon Skeet 中没有任何可以为空的类型。可以找到其他信息here

相关问题