【问题标题】:Parametrized Constructor in Struct [duplicate]结构中的参数化构造函数
【发布时间】:2017-10-02 07:44:04
【问题描述】:

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

Point p = new Point()

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

Point p = new Point()

我要问的问题是为什么编译器允许 struct 创建对象而停止类创建对象?

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

【问题讨论】:

  • 你的问题是什么?你没有问一个。
  • 正确,这是结构的行为。见here
  • 还有另一个问题来自 Jon Skeet - stackoverflow.com/questions/333829/…
  • 实际上,Eric Lippert wrote a great comment 关于“为什么”的问题,即 “对“为什么语言是这样的”的充分回答是重新讨论我们进行的数小时的辩论关于它。”.
  • 您能否发送您的 C# 代码以了解您的问题

标签: c#


【解决方案1】:

因为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。但是使用 struct 它会为您提供一个实例。

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

【讨论】:

    【解决方案2】:

    当您使用类时,您可以定义其对象是否可以以任何特定方式初始化。 但是,说到struct,应该总是可以不带参数初始化的。

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

    已编辑: 虽然我概述了将struct 作为值类型的通用规则,但实际上有几种方法可以用null(或模拟它)初始化struct。当然,最常见的是Nullable<>,它足以满足大多数(如果不是全部)目的。对于那些对它的工作原理以及将null 设置为struct 的其他方法感到好奇的人,我推荐C# in Depth第 4 章。对可空类型无话可说 乔恩斯基特。可以在here 找到更多信息。

    【讨论】:

    • 我认为赏金的原因是“寻找来自可靠和/或官方来源的答案”。我很惊讶被授予的答案是一个“在我看来...”类型的答案。
    • @Dmitriy Volkov 哪个类别属于可空结构?它是一个结构体,可以设置为空:msdn.microsoft.com/en-us/library/b3h38hb0(v=vs.110).aspx
    • @Rekshino 嗯,是的,有几种方法可以将 null 设置为结构,正如 Jon Skeet 在他的书中所讨论的那样。一般来说,很少涉及到实现这样的机制,但是如果你想了解它,你可以阅读 Jon Skeet 的“C# 深度:第 4 章。对可空类型说什么”。
    • @Rekshino 在这里,如果您对此类机制感到好奇,您可能会感兴趣。 stackoverflow.com/questions/2503811/…
    • 我对它并不好奇,也不需要实现它,它是c# 2.0以来的标准。我的意思是,在你的回答中你说,该结构不能设置为 null。
    【解决方案3】:

    您可以在 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 2016-03-05
      • 2020-01-23
      • 2017-04-01
      相关资源
      最近更新 更多