The very first talk I gave on .NET was on custom attributes – some time way back in late 2000 or early 2001. At the time I was espousing the benefits of using custom attributes to add on details of unit tests and bug fixes.
There have been many additions to .NET since then and I spied a couple of *really* cool new attributes in .NET 4 the other day so had to share them.
Enter (drum roll please) :-
Yay!
These are (I believe) a real productivity boost, and will make your code much easier to read. I bet you have some code like the following hanging around, don’t you…
public class Thingy { public Thingy() : this("Default", -1) { } public Thingy(string name) : this(name, -1) { } public Thingy(string name, int whatever) { _name = name; _whatever = whatever; } // Other code... private string _name; private int _whatever; }
Now there’s nothing desperately wrong with this, although I feel that 3 constructors is a bit ugly, I’d rather just have one. And what if I want to change the default value for the ‘whatever’ value – there are two places it’s used in the code above and I’d need to update both which is a bit on the fragile side.
With these swanky new attributes I can have just the one constructor…
public class Thingy { public Thingy([Optional, DefaultParameterValue("Default")] string name, [Optional, DefaultParameterValue(-1)]int whatever) { } }
Now that’s a whole lot better if you ask me! My defaults are in one place, I have only one constructor rather than three (obviously this works on methods too), and Intellisense and the C# environment understand the [Optional] attribute and present the appropriate stuff to me.
Now as if that wasn’t enough we’ve updated C# to support this without even having to write attributes (thanks to Wes Haggard for pointing this out to me)…
public class Thingy { public Thingy(string name = "Default", int whatever = -1) { } }
Ooh, how cool is that? All in all I’m very happy with this little addition to .NET and C#.