An argument (lol) for the use of explicit argument names in C# function calls even when they seem redundant.
- You can assert correctness when reviewing the call site in a dumb text display (e.g. a patch in a github pull request)
- Parameter-order refactoring won’t introduce subtle bugs and breaking changes.
This is particularly important when you have multiple arguments of the same type.
It’s also a good idea when the call doesn’t immediately make it obvious what the meaning of the parameter is. E.g. Foo(3)
vs Foo(sizeInMeters: 3)
.
No argument names (bad)
Starting point:
void Main()
{
Foo("Home", "Blah"); // don't do this
}
void Foo(string importantThing, string otherThing)
{
switch (importantThing)
{
case "Home":
DoSomething();
break;
default:
DoSomethingElse();
break;
}
Log(otherThing);
}
If Foo()
is defined in a different file it’s hard to eyeball Main()
and tell if the arguments line up properly.
If I now re-order the arguments of Foo()
can you easily spot that the call site in Main()
is now incorrect?
void Main()
{
Foo("Home", "Blah"); // Now broken!! But can you tell?
}
void Foo(string otherThing, string importantThing) // <-- parameters flipped
{
switch (importantThing)
{
case "Home":
DoSomething();
break;
default:
DoSomethingElse();
break;
}
Log(otherThing);
}
With argument names (good)
Starting point:
void Main()
{
Foo(importantThing: "Home", otherThing: "Blah");
}
void Foo(string importantThing, string otherThing)
{
switch (importantThing)
{
case "Home":
DoSomething();
break;
default:
DoSomethingElse();
break;
}
Log(otherThing);
}
You can now easily see that "Home"
is going to "importantThing"
, even in a plain-text view of the file.
If I now re-order the arguments of Foo()
again, it doesn’t break because the compiler knows which string to connect to which parameter. Win.
void Main()
{
Foo(importantThing: "Home", otherThing: "Blah"); // still valid!
}
void Foo(string otherThing, string importantThing) // <-- refactored
{
switch (importantThing)
{
case "Home":
DoSomething();
break;
default:
DoSomethingElse();
break;
}
Log(otherThing);
}
Top comments (0)