为什么无参数结构构造函数在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
无参数构造函数如何解决这个问题?
Where you are in the code
意味着您将根据使用结构的代码的位置获得不同的行为。
例如,如果您有一个标记为内部的无参数构造函数,那么如果您从定义结构的同一程序集或从另一程序集创建实例,则行为会有所不同。
在第一种情况下,调用无参数构造函数是因为它是可访问的,在第二种情况下调用default(T)。private
和protected
构造函数也存在同样的情况。
例如,假设我们有两个程序集,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();
),在每种上下文中,您所说的机制都必须表现得不同。在第一个示例中,您可以使用构造函数,而不管它的访问修饰符是什么。在第二个示例中,如果是public
或internal
,则可以访问一个。在第三个例子中,只有当它是public
时,它才能被使用。
使其成为public
简化了情况,因为它在所有这些上下文中都可以访问。