According to RFC 2396,
The plus "+", dollar "$", and comma "," characters have been added to
those in the "reserved" set, since they are treated as reserved within the query component.
Indeed, search this site for "plus + comma , dollar $", and you get
http://stackoverflow.com/search?q=plus+%2B+comma+,+dollar+$
Plus is only encoded (by the application) when it's not being used as a delimiter.
But as others have observed, .NET's UrlDecode
function converts plus to space. Where is this behavior specified?