I have faced with a situation in VB.NET and C# (.NET2) with the visibility of the static/shared members. It seems to me a little strange in VB.NET:
public class A
{
private static A instance;
public static A Instance
{
get { return instance; }
}
public string Name { get { } }
}
usage:
A.Instance.Name // ONLY Name is “visible”
VB.NET:
Public Class A
Private Shared _instance As A
Public Shared ReadOnly Property Instance() As A
Get
Return _instance
End Get
End Property
Public ReadOnly Property Name() As String
Get
Return ""
End Get
End Property
End Class
usage:
A.Instance.Instance.Instance.Instance...
// shared member behaves like a class public one I can repeat it to infinite..
is this a Microsoft oversight or a VB.NET “feature”?
It’s not an oversight but your VB code will trigger a warning, which plainly means: do not use this notation.
In VB, static members can be accessed via an instance, since strictly speaking, VB doesn’t have
static: VB has the keywordShared, meaning that the member is shared between all instances, as opposed tostaticwhere a member doesn’t belong to any instance.Now, this is a semantical distinction between those keywords. It just so happens that these two distinct semantics tend to have the exact same effect.
Of course,
staticin C# is today identical toSharedin VB.NET but their legacy is different and VB’sSharedsimply has a different history and therefore historically a different meaning. With this meaning, it makes absolutely sense to accessSharedmembers via an instance.It also makes sense when used together with
Option Strict Off(loose typing): here, you sometimes don’t know a variable’s type but you still might want to access aSharedmember. Now, you’ve got no choice but to use an instance to access it: