繁体   English   中英

可以让结构具有默认值无效吗?

[英]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;
    }
}

感觉就像一个“价值”。 它很小且一成不变。 它的外观和感觉“结构化”。

但是存在默认值问题...将“ Horizo​​ntal = 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM