[英]Is it okay for a struct to have default value invalid?
考虑以下结构
public struct ResizeFactor
{
public readonly float Horizontal;
public readonly float Vertical;
public ResizeFactor(float horizontal, float vertical)
{
if (horizontal <= 0)
throw new ArgumentOutOfRangeException("...");
if (vertical <= 0)
throw new ArgumentOutOfRangeException("...");
Horizontal = horizontal;
Vertical = vertical;
}
}
感觉就像一个“价值”。 它很小且一成不变。 它的外观和感觉“结构化”。
但是存在默认值问题...将“ Horizontal = Vertical = 0”作为默认值的ResizeFactor是不合适的。
例:
var myResizeFactor = new ResizeFactor();
// myResizeFactor.Horizontal = 0
我知道我可以改用一个类,而只是“禁用”默认的无参数构造函数,但这并不是重点。 问题是:创建这样的结构是否合法? 一个无效的默认值?
最后但并非最不重要的一点:这是这样的问题的正确地方吗? 或者我应该在其他地方发布,例如https://softwareengineering.stackexchange.com/
我会尽力使默认值有效,是的。 例如,您可以执行以下操作:
public struct ResizeFactor
{
private readonly float horizontal;
private readonly float vertical;
public float Horizontal => horizontal == 0f ? 1.0f : horizontal;
public float Vertical => vertical == 0f ? 1.0f : vertical;
public ResizeFactor(float horizontal, float vertical)
{
if (horizontal <= 0)
throw new ArgumentOutOfRangeException("...");
if (vertical <= 0)
throw new ArgumentOutOfRangeException("...");
this.horizontal = horizontal;
this.vertical = vertical;
}
}
这意味着默认内部表示形式的有效值为(1f,1f)-基本上是无操作调整大小。
我们在Noda Time中使用相同的方法,其中各种值类型可以包含对时区的引用-如果值为null,则认为该时区为UTC。
请注意,这是暴露属性而不是字段的好处之一...内部细节变得不那么重要。
顺便说一句,我认为实际上“调整为0”是一个完全合理的因素。 毕竟,如果您允许float.Epsilon
,它将几乎将任何东西的大小都调整为0或非常非常小……调整大小和将其调整为0真的有那么大的区别吗?
如果在声明结构时省略了new关键字 ,则显然可以得到具有未初始化的无效值的结构:
使用new运算符创建结构对象时,将创建该对象并调用适当的构造函数。 与类不同,可以在不使用new运算符的情况下实例化结构。 在这种情况下,没有构造函数调用,这使分配更加有效。 但是,在初始化所有字段之前,这些字段将保持未分配状态,并且无法使用该对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.