I am reading Effective C# by Bill Wagner. In Item 14 - Minimize Duplicate Initialization Logic, he shows the following example of using the new optional parameters feature in a constructor:
public MyClass(int initialCount = 0, string name = "")
Notice that he used ""
instead of string.Empty
.
He comments:
You'll note [in an example above] that the second constructor specified "" for the default value on the name parameter, rather than the more customary
string.Empty
. That's becausestring.Empty
is not a compile-time constant. It is a static property defined in the string class. Because it is not a compile constant, you cannot use it for the default value for a parameter.
If we cannot use the string.Empty
static in all situations, then doesn't that defeat the purpose of it? I thought that we would use it to be sure that we have a system-independent means of referring to the empty string. Is my understanding wrong? Thanks.
UPDATE
Just a follow up comment. According to MSDN:
Each optional parameter has a default value as part of its definition. If no argument is sent for that parameter, the default value is used. Default values must be constants.
Then we aren't be able to use System.Environment.NewLine
either, or use newly instantiated objects as default values. I haven't used VS2010 yet, and this is disappointing!
As of the C# 2.0 compiler, there is very little point to String.Empty
anyway, and in fact in many cases it's a pessimisation, since the compiler can inline some references to ""
but can't do the same with String.Empty
.
In C# 1.1 it was useful to avoid creating lots of independent objects all containing the empty string, but those days are gone. ""
works just fine.