I was reading an interesting debate on Google Groups today titled, C# is too nitpicky?
The main discussion was about the design difference of VB.NET's Shared, and C#'s static members. Shared and static are the same - they both belong to a type itself rather than to a specific object. Knowing that, let's take a look at the possible design flaws in question.
VB.NET
Dim m as MessageBox
m.Show("Hello")
C#
MessageBox.Show("Hello")
The MessageBox.Show is a static (Shared in VB.NET) method that cannot be instantiated. The difference here is that C# restricts the programmer from calling a static method from an instance of an object, and VB.NET does not. (Allowing you to do it either way)
Now let's take a look at the two sides.
VB.NET Design Flaw
"The point is that a static member is not associated with any single instance of a class. So, it
makes little sense to allow the calling of these methods through an instance. In this instance, C# get's it right."
C# Design Flaw
"It's shared between /all/ instances, so calling these methods through an instance makes sense."
C# or VB.NET Design Flaw?
To reiterate, Shared/static members belong to a type, not a specific object. The way VB.NET handles this is not intuitive, and therefore my vote is for VB.NET.