考虑以下结构
ul li {
position: relative;
}
ul ul {
position: absolute;
display: none;
}
ul > li:hover ul {
display: block;
position: absolute;
background-color: #FF0000;
}
感觉就像'价值'。 这是小而不可改变的。 它看起来和感觉'结构'。
但是存在默认值问题......将ResizeFactor与Horizontal = 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/
答案 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,没有构造函数调用,这使得分配更多 高效。但是,字段将保持未分配和对象 在初始化所有字段之前不能使用。