I've heard people poke fun at Java by asking the question "how many Java applications do you run?". The question doesn't work with me because my editor, my terminal emulator, my revision history browser and check-in tool are all written in Java. These are the programs I use the most.
On the other hand, I hadn't ever run a C# application until a couple of weeks back. I wouldn't even have been able to name one. Which is perhaps a good thing. In an ideal world, you wouldn't be able to distinguish applications on the basis of the tools used to build them.
But I can now name a C# application. It's called SharpReader, and it's a news aggregator like NetNewsWire. Only not nearly as good. I'm not particularly interested in the details of this particular application, and why NetNewsWire is better: what interests me is that a C# application doesn't automatically look and feel like a Windows application.
At this point, I realize that the very idea of a consistent "Windows" look and feel doesn't seem right. That isn't the impression Windows leaves me with. Even two different Microsoft applications will happily use scroll bars that behave differently, different menu bar implementations, and the like. I'd always assumed that these things weren't implemented by each application, but on Windows that doesn't seem to be the case. And even when you get past things like that, there's a flagrant disregard for good taste and even Microsoft's Windows User Experience guidelines (they exist, they're just not widely followed, not even by Microsoft themselves).
I can't really explain how disorientating an experience it was to configure my parents' wireless network card on their PC. Mac users will already know what I mean, and I can only assume Windows users just don't notice that no two applications look or feel alike. There's no graphical language, no spacing or typographical conventions, no color conventions, nothing of anything that helps you steady yourself in an artificial world where anything is possible. Unless you've had anything better, you probably think this is how computers have to be. My mum thought her laptop was light until she was holding my PowerBook in her weak left hand and realized she couldn't lift hers without using both hands, and when it dawned on her, she said "you've spoilt it for me now". So maybe Unix users shouldn't bang on about stability and reliability and scriptability, and Mac users shouldn't bang on about beauty and consistency. Maybe we're not helping anyone?
Anyway, back to what SharpReader taught me.
C# doesn't seem to ensure that your application's buttons look like buttons. Or that your application's dialogs have any kind of Windows-like spacing. Or that your application won't happily retain 20MB of heap. Or that your application won't swap back in really slowly. (I never understood why Windows users leveled that criticism at Java applications: Windows just seems to cope much worse in such situations than Unix, and it seems to get itself into such situations much more easily. And experience with GNOME suggests that the C programmers have nothing to laugh about either. The application that takes longest to swap back in after a heavy C++ link on my Linux box? It's none of the Java applications: it's Evolution, which is a real dog. Thunderbird, which I've recently switched to, has no such problem on the same mailboxes.)
Don't get me wrong: I'm sure writing C# is a better experience than writing C++. But if the cost is being tied to Windows, and encouraging the dominance of bad products whose main selling point is being cheap (if only because they come "free" with your computer or you steal them because "everyone" does)... what do I get in return?