事实上,MSDN 有一些很好的指导struct
考虑定义结构而不是类,如果
类型较小且通常寿命较短或通常嵌入
其他物体。
除非类型具有以下所有内容,否则不要定义结构
特征:
它在逻辑上表示单个值,类似于原始类型
(整数、双精度数等)。
它的实例大小小于 16 字节。
它是不可改变的。
它不必经常装箱。
请注意,它们是考虑因素考虑到 a struct
,而且它从来都不是“这个should始终是一个结构”。这是因为选择使用struct
可能会对性能和使用产生影响(正面和负面),应谨慎选择。
特别注意他们不推荐struct
对于> 16字节的东西(那么复制的成本变得比复制引用更昂贵)。
现在,对于您的情况,除了创建一个工厂来生成一个工厂之外,确实没有什么好的方法可以做到这一点struct
为您处于默认状态或执行某种操作trick
在你的财产中欺骗它在第一次使用时初始化。
请记住,一个struct
应该这样工作new X()
== default(X)
,即新建一个struct
将包含该字段所有字段的默认值struct
。这是非常明显的,因为 C# 将not让您为 a 定义一个无参数构造函数struct
,尽管奇怪的是它们允许默认所有参数而不发出警告。
因此,我实际上建议你坚持使用class
并使其不可变,然后检查null
关于它被传递到的方法。
public class ExampleClass
{
// have property expose the "default" if not yet set
public int Value { get; private set; }
// remove default, doesn't work
public ExampleStruct(int value)
{
Value = value;
}
}
However,如果你绝对must have a struct
出于其他原因 - 但请考虑以下费用struct
例如复制等 - 你可以这样做:
public struct ExampleStruct
{
private int? _value;
// have property expose the "default" if not yet set
public int Value
{
get { return _value ?? 1; }
}
// remove default, doesn't work
public ExampleStruct(int value)
: this()
{
_value = value;
}
}
请注意,默认情况下,Nullable<int>
将null
(那是,HasValue == false
),因此如果这是 true,我们还没有设置它,并且可以使用空合并运算符返回我们的默认值1
反而。要是我们did在构造函数中设置它,它将是非空的并取该值......