In C# IsEmpty
(on System.Windows.Rect
) doesn't return true
where Width
or Height
is zero. In MSDN it is noted but not (clearly) explained:
Do not use this property to test for zero area; a rectangle with zero area is not necessarily the Empty rectangle. For more information, see the Empty property.
Why isn't IsEmpty implemented as:
public bool IsEmpty
{
return Width == 0 || Height == 0;
}
What is the use case for the current implementation?
Rect.IsEmpty
is not a check for an “empty rectangle”, as in it having no area, it is more a check whether this rectangle structure is the empty rectangle. The empty rectangle is basically the default value for the Rect
struct, with all fields being set to their initial value zero.
So you have to understand IsEmpty
less about the (mathematical) “rectangle” but more about the highly technical data structure in .NET.
Note that the implementation of Rect.IsEmpty
matches other rectangles, such as Rectangle.IsEmpty
. And finally, the “emptyness” of structures also appears elsewhere in the framework, for example Guid.Empty
is the same idea.
There's a convention in the standard library that's (somewhat inconsistently) followed throughout, but that leads to confusion in this case. Several types have the Empty property (or field), where "Empty" denotes some special value that is in some sense default, empty or uninitialized, depending on the type.
Unfortunately, this doesn't always make sense.
Some examples:
string.Empty
- the "" string.Point.Empty
- the point (0, 0), although it doesn't really make sense to call a point "empty". Size.Empty
- Width = -infinity, Heigth = -infinity. ... Yeah... Guid.Empty
- 00000000-0000-0000-0000-000000000000. I guess this makes sense. Kind of.EventArgs.Empty
- a value to use with events that do not have event data. Unit.Empty
- represents an empty Unit. Does that mean undefined? I don't know. Padding.Empty
- Right = Left = Top = Bottom = 0An example of an inconsistency:
TimeSpan.Zero
- There is no Empty field or property. But Zero is probably a better name here anyway.
For the Rect class, Rect.Empty
is a
"special value that represents a rectangle with no position or area [...] which has X and Y property values of PositiveInfinity, and has Width and Height property values of NegativeInfinity."
Rect.IsEmpty
checks for this special value. Why? Someone thought this was a good idea. Maybe they were wrong.
P.S. It's interesting to note that there are other Rectangle types in the .Net ecosystem that follow this convention but have a different notion of "Empty". E.g., XNA's Rectangle.Empty
returns a Rectangle with all of its values set to zero (contrast this with the Rect
class).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With