在C#中IsEmpty
(在System.Windows.Rect
上)不会返回true
或Width
为零的Height
。在MSDN中,它被注意到但没有(明确地)解释:
不要使用此属性来测试零区域;面积为零的矩形不一定是空矩形。有关更多信息,请参阅Empty属性。
为什么不将IsEmpty实现为:
public bool IsEmpty
{
return Width == 0 || Height == 0;
}
当前实施的用例是什么?
答案 0 :(得分:5)
Rect.IsEmpty
不是检查“空矩形”,因为它没有区域,更多的是检查这个矩形结构是否是 empty rectangle 。空矩形基本上是Rect
结构的默认值,所有字段都设置为初始值为零。
所以你必须更少了解IsEmpty
关于(数学)“矩形”的内容,但更多关于.NET中高度技术性的数据结构。
请注意Rect.IsEmpty
的实现与其他矩形匹配,例如Rectangle.IsEmpty
。最后,结构的“空洞”也出现在框架的其他地方,例如Guid.Empty
是同样的想法。
答案 1 :(得分:5)
标准库中有一个惯例(有些不一致)贯穿始终,但在这种情况下会导致混淆。有几种类型具有Empty属性(或字段),其中" Empty"表示某些特殊值,在某种意义上默认,空或未初始化,具体取决于类型。
不幸的是,这并不总是有意义的。
一些例子:
string.Empty
- ""字符串。Point.Empty
- 点(0,0),虽然调用点"空"确实没有意义。 Size.Empty
- 宽度= -infinity,Heigth = -infinity。 ......是的...... Guid.Empty
- 00000000-0000-0000-0000-000000000000。我想这是有道理的。那种。EventArgs.Empty
- 用于没有事件数据的事件的值。 Unit.Empty
- 代表一个空单位。这是否意味着未定义?我不知道。 Padding.Empty
- 右=左=上=下= 0 不一致的一个例子:
TimeSpan.Zero
- 没有空字段或属性。但无论如何,Zero在这里可能是一个更好的名字。
对于Rect类,Rect.Empty
是
"表示没有位置或区域的矩形的特殊值 [...]其中X和Y属性值为PositiveInfinity,并且具有 NegativeInfinity的宽度和高度属性值。"
Rect.IsEmpty
检查此特殊值。为什么?有人认为这是个好主意。也许他们错了。
P.S。值得注意的是,.Net生态系统中还有其他Rectangle类型遵循此约定,但有一个不同的概念,即#34; Empty"。例如,XNA' s Rectangle.Empty
返回一个Rectangle,其所有值都设置为零(与Rect
类对比)。