Tuesday, 14 September 2010

reddit'd (Followup to 'Construct Something Else')

Fame at last! Fame at last!

My last piece, "Construct something else!" got a bit of attention when someone posted it on reddit.That was unexpected.

Remember the rule; If you publish something that's a bad idea in hindsight, post a "clarification" article claiming you've been misunderstood and that you never thought it was a good idea in the first place. Then hide in the shower.


You see, I think I've been misunderstood. I was reading stackoverflow and I found the question asking about c# constructors. There was the comment from Eric Lippert, talking about the possibility of implementing this feature, but they were lacking a good reason to undertake the effort. Then I remembered I had exactly what he was looking for, a real-world use case! So I wrote up my experiences in a blog post and left a comment on the stack overflow question.

I thought I was rather clear that I was just providing Mr Lippert with a use case, rather than actually advocating it. Nonetheless, some people mistakenly took my post as advocacy and responded as such. Now if you'll excuse me, I'm going to go have a shower.

:-)

But seriously, I remain of the opinion that implementing pseudo-constructors would be a good thing, but probably not worth the time for Microsoft to implement. But first, a quick aside to clarify (there's that word again) how it could work. Just so we're all clear (!) on what it is I'm advocating.

A pseudo-constructor would essentially be a static factory function. Call it, and it returns an instance of the class, perhaps using a private real-constructor inside. The only difference being that it can be called using the new operator. The compiler sees that the parameters match the pseudo-constructor signature and it generates code to call that static function instead. From a MSIL/CIL view, it's just like a normal static function.

So why would this be a good thing?

Changing the interface without changing caller code.

This is the reason I raised in my original post. If version 1 of a DLL has a real-constructor, version 2 can use a pseudo-constructor in it's place. The caller code would have to be recompiled, but the C# code would not need to be modified.

Intellisense™ simplification.

How many times have you needed an instance of particular class, typed new ClassName, only for Intellisense™ to show that no constructors are available. You slap your forehead and remember that this class uses static factory functions instead. If these could be called with a new operator, they would all appear in the same list.

(I suspect this was the original motivation for considering the feature in the first place.)

That's it?

There's a few good reasons not to make this change, which I'll briefly discuss. Enjoy.

They won't be real constructors.
(Thanks to reddit user "grauenwolf".)

Sometimes, only a real constructor will do. When writing a subclass constructor, you can call the base class's constructor just before the first opening brace using the base keyword. This would have to be a real constructor call, as you can't just decide which base class to use at run-time.

Adding pseudo constructors doesn't take away real constructors, but it might lead to confusion when people see that a base classes constructors have gone missing.

You don't need it.
(Thanks to "Anthony" for commenting on the original post.)

You can do all this by making a class full of delegate instances. The constructor can select what functions to fill into those delegates at run-time. Add some [Obsolete] attributes so anyone writing new code will code against the new preferred objects.


So I don't think this new feature would break anything, except it would be taking up the time of the clever people at Microsoft. Nice to have, but we don't need it.

If you're in the mood for discussing future directions of the C# language, please take at look at my earlier piece on destructors for structs. I'm interested in any thoughts on the subject or any reasons why it wouldn't work.

I hope I've gained a little bit of an readership from this experience. If you're reading this, please leave a comment. Without comments, we're just bumping around in a closed system and tending towards entropy. Here's some nice charts for a bit of insight on the reddit people.





Picture credit:
"The Walk of Fame" by flickr user Storm Crypt.
Readership charts by blogger.

No comments:

Post a Comment