结构的默认值是否可以无效?

时间:2016-03-19 18:12:04

标签: c# class struct

考虑以下结构

ul li {
position: relative;
}

ul ul {
position: absolute;
display: none;
}

ul > li:hover ul {
display: block;
position: absolute;
background-color: #FF0000;
}

感觉就像'价值'。 这是小而不可改变的。 它看起来和感觉'结构'。

但是存在默认值问题......将ResizeFactor与Horizo​​ntal = Vertical = 0作为默认值感觉不对。

示例:

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;
    }
}

我知道我可以使用一个类而只是'禁用'默认的无参数构造函数,但这不是真正的重点。 问题是:创建这样的结构是否合法?一个具有无效的默认值?

最后但并非最不重要:这是一个像这样的问题的正确位置?或者我应该在其他地方发帖,例如https://softwareengineering.stackexchange.com/

2 个答案:

答案 0 :(得分:2)

我会尽力使默认值有效,是的。例如,您可以执行以下操作:

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。

请注意,这是公开属性而不是字段的好处之一......内部细节变得不那么相关。

顺便说一句,我认为实际上是&#34;调整为0&#34;作为一个因素是完全合理的。毕竟,如果你允许float.Epsilon将几乎任何东西调整为0或者非常非常小,那么它之间是否真的有很大差异并且调整为0?

答案 1 :(得分:0)

如果你在声明结构时omit the new keyword,你显然可以得到一个带有未初始化的无效值的结构:

  

使用new运算符创建struct对象时,它会获得   创建并调用适当的构造函数。与课程不同,   可以在不使用new运算符的情况下实例化结构。在这样的   case,没有构造函数调用,这使得分配更多   高效。但是,字段将保持未分配和对象   在初始化所有字段之前不能使用。