为什么无参数结构构造函数在C#中必须是公共的

本文关键字:参数 结构 构造函数 为什么 | 更新日期: 2023-09-27 18:28:39

到目前为止在C#中被禁止的无参数结构构造函数,现在在Visual Studio 14 CTP(编写本文时为CTP 4)中作为实验功能实现。

但是,此类无参数构造函数必须是公共的。您不能将它们设置为内部或使用任何其他访问修饰符。

在2014年8月27日的C#设计说明中,我找到了对此的解释:

C#、VB和F#都会调用一个可访问的无参数构造函数(如果找到的话)。如果有一个,但它不可访问,C#和VB将回填default(T)。(F#会抱怨。)

新S()的成功但不同的行为是有问题的,这取决于你在代码中的位置。为了最大限度地减少这个问题,我们应该将其设置为显式无参数构造函数必须是公共的。这样,如果你想替换"默认行为",你可以在任何地方都这样做。

什么是";取决于你在代码中的位置";,以及强制使用public无参数构造函数如何解决这个问题?

为什么无参数结构构造函数在C#中必须是公共的

Where you are in the code意味着您将根据使用结构的代码的位置获得不同的行为。

例如,如果您有一个标记为内部的无参数构造函数,那么如果您从定义结构的同一程序集或从另一程序集创建实例,则行为会有所不同。

在第一种情况下,调用无参数构造函数是因为它是可访问的,在第二种情况下调用default(T)。privateprotected构造函数也存在同样的情况。

例如,假设我们有两个程序集,A和B:

//Assembly A
public struct SomeStruct
{
   public int x = 0;
   internal SomeStruct()
   { 
       x = 10;
   }
}
public static void DoSomething()
{
      var someStruct = new SomeStruct();
      Console.WriteLine(someStruct.x); // prints 10  
}

//Assembly B
public static void DoAnotherThing()
{
    var someStruct = new SomeStruct();
    Console.WriteLine(someStruct.x); // prints 0
}

这导致了依赖于where you are in the code的不一致行为,以及他们强制使用public构造函数的原因。

您可以"在代码中的某个位置",其含义如下:

  • 在结构的上下文中,即:

struct X
{
    //...
    public X CreateNew() { return new X(); }
}
  • 在程序集的上下文中:

new X();  // from the same assembly
  • 在另一个程序集中

new X(); // from another assembly

因此,对于完全相同的代码(new X();),在每种上下文中,您所说的机制都必须表现得不同。在第一个示例中,您可以使用构造函数,而不管它的访问修饰符是什么。在第二个示例中,如果是publicinternal,则可以访问一个。在第三个例子中,只有当它是public时,它才能被使用。

使其成为public简化了情况,因为它在所有这些上下文中都可以访问。