在宽度或高度为零的情况下,Rect IsEmpty不返回true

时间:2017-08-10 07:08:14

标签: c# rect

在C#中IsEmpty(在System.Windows.Rect上)不会返回trueWidth为零的Height。在MSDN中,它被注意到但没有(明确地)解释:

  

不要使用此属性来测试零区域;面积为零的矩形不一定是空矩形。有关更多信息,请参阅Empty属性。

为什么不将IsEmpty实现为:

public bool IsEmpty
{
    return Width == 0 || Height == 0;
}

当前实施的用例是什么?

2 个答案:

答案 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类对比)。