struct
我今天在创建一个保存一堆数据时遇到了这个问题。这是一个例子:
public struct ExampleStruct
{
public int Value { get; private set; }
public ExampleStruct(int value = 1)
: this()
{
Value = value;
}
}
看起来很好,花花公子。问题是当我尝试使用此构造函数而不指定值并希望对参数使用默认值 1 时:
private static void Main(string[] args)
{
ExampleStruct example1 = new ExampleStruct();
Console.WriteLine(example1.Value);
}
此代码输出0
和不输出1
。原因是所有结构都有公共的无参数构造函数。所以,就像我如何调用this()
我的显式构造函数Main
一样,同样的事情发生在new ExampleStruct()
实际调用ExampleStruct()
但不调用的地方ExampleStruct(int value = 1)
。因为它这样做了,所以它使用int
0 的默认值作为Value
.
更糟糕的是,我的实际代码正在检查该int value = 1
参数是否在构造函数的有效范围内。将其添加到ExampleStruct(int value = 1)
上面的构造函数中:
if(value < 1 || value > 3)
{
throw new ArgumentException("Value is out of range");
}
因此,就目前而言,默认构造函数实际上创建了一个在我需要它的上下文中无效的对象。任何人都知道我可以:
- A. 调用
ExampleStruct(int value = 1)
构造函数。 - B. 修改为
ExampleStruct()
构造函数填充默认值的方式。 - C. 其他一些建议/选项。
另外,我知道我可以使用这样的字段而不是我的Value
属性:
public readonly int Value;
但我的理念是私下使用字段,除非它们是const
or static
。
最后,我使用 astruct
而不是 aclass
的原因是因为这只是一个保存非可变数据的对象,在构造它时应该完全填充,当作为参数传递时,不应该null
(因为它通过值作为 a struct
) 传递,这就是 struct 的设计目的。