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

Wou*_*ter 2 c# rect

在C#IsEmpty(on System.Windows.Rect)中不返回truewhere WidthHeight为零.在MSDN中,它被注意到但没有(明确地)解释:

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

为什么不将IsEmpty实现为:

public bool IsEmpty
{
    return Width == 0 || Height == 0;
}
Run Code Online (Sandbox Code Playgroud)

当前实现的用例是什么?

pok*_*oke 5

Rect.IsEmpty不是检查"空矩形",因为它没有区域,更多的是检查这个矩形结构是否空矩形.空矩形基本上是Rect结构的默认值,所有字段都设置为初始值零.

因此,您必须IsEmpty更少了解(数学)"矩形",而是更多地了解.NET中的高技术数据结构.

注意,Rect.IsEmpty匹配其他矩形的实现,如Rectangle.IsEmpty.最后,结构的"空洞"也出现在框架的其他地方,例如Guid.Empty同样的想法.


Fil*_*vić 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的Width和Height属性值."

Rect.IsEmpty检查此特殊值.为什么?有人认为这是个好主意.也许他们错了.

PS有趣的是,.Net生态系统中还有其他矩形类型符合此约定,但具有不同的"空"概念.例如,XNA Rectangle.Empty返回一个Rectangle,其所有值都设置为零(与Rect类对比).