Why is the default value of the string type null instead of an empty string?
Solution 1:
Why is the default value of the string type null instead of an empty string?
Because string
is a reference type and the default value for all reference types is null
.
It's quite annoying to test all my strings for null before I can safely apply methods like ToUpper(), StartWith() etc...
That is consistent with the behaviour of reference types. Before invoking their instance members, one should put a check in place for a null reference.
If the default value of string were the empty string, I would not have to test, and I would feel it to be more consistent with the other value types like int or double for example.
Assigning the default value to a specific reference type other than null
would make it inconsistent.
Additionally
Nullable<String>
would make sense.
Nullable<T>
works with the value types. Of note is the fact that Nullable
was not introduced on the original .NET platform so there would have been a lot of broken code had they changed that rule.(Courtesy @jcolebrand)
Solution 2:
Habib is right -- because string
is a reference type.
But more importantly, you don't have to check for null
each time you use it. You probably should throw a ArgumentNullException
if someone passes your function a null
reference, though.
Here's the thing -- the framework would throw a NullReferenceException
for you anyway if you tried to call .ToUpper()
on a string. Remember that this case still can happen even if you test your arguments for null
since any property or method on the objects passed to your function as parameters may evaluate to null
.
That being said, checking for empty strings or nulls is a common thing to do, so they provide String.IsNullOrEmpty()
and String.IsNullOrWhiteSpace()
for just this purpose.
Solution 3:
You could write an extension method (for what it's worth):
public static string EmptyNull(this string str)
{
return str ?? "";
}
Now this works safely:
string str = null;
string upper = str.EmptyNull().ToUpper();
Solution 4:
You could also use the following, as of C# 6.0
string myString = null;
string result = myString?.ToUpper();
The string result will be null.