static / Shared dans VB.NET et visibilité C #
J'ai confronté à une situation dans VB.NET et C# (.NET2) avec la visibilité de la statique/membres partagés. Il me semble un peu étrange dans VB.NET:
public class A
{
private static A instance;
public static A Instance
{
get { return instance; }
}
public string Name { get { } }
}
utilisation:
A.Instance.Name
//SEUL Nom est "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
utilisation:
A.Instance.Instance.Instance.Instance...
//partagée membre se comporte comme une classe publique, je peux le répéter à l'infini..
est-ce un Microsoft de surveillance ou d'un VB.NET la "fonctionnalité"?
source d'informationauteur serhio
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas un oubli, mais votre code VB sera déclencher une alerte, ce qui signifie clairement: ne pas utiliser cette notation.
En VB, les membres statiques peut accessible au travers d'un exemple, car à proprement parler, VB n'a pas
static
: VB est le mot-cléShared
ce qui signifie que le membre est partagé entre toutes les instances, par opposition àstatic
où un membre n'appartenant pas à tout instance.Maintenant, c'est un semantical distinction entre ces mots-clés. Il se trouve que ces deux distincts sémantique ont tendance à avoir exactement le même effet.
Bien sûr,
static
en C# est aujourd'hui identique àShared
dans VB.NET mais leur héritage est différent et VB de laShared
simplement a une histoire différente et, par conséquent, à l'origine, une signification différente. Avec ce sens, il ne fait absolument le sens de l'accèsShared
membres au moyen d'un exemple.Il est également judicieux lorsqu'il est utilisé avec
Option Strict Off
(dactylographie): ici, vous avez parfois ne sais pas le type d'une variable, mais vous pourriez encore envie d'accéder à unShared
membre. Maintenant, vous avez pas d'autre choix que d'utiliser une instance pour y accéder:C'est une fonction; ce n'est pas un bug. VB est prévu. Langues différentes, de faire des choix différents quant à savoir si une méthode statique peut être considéré comme une méthode d'une instance ou non. VB permet. C++ permet. C# ne pas.
Rappelez-vous, les critères de conception des différentes langues sont différentes, et, par conséquent, les décisions prises sont différentes. Sur le C# de l'équipe de conception, nous avons une grande valeur à une définition de langage qui rend illégale des motifs qui paraissent suspectes; car il n'y a pas de sens pour passer d'une instance comme le récepteur à une méthode statique (à moins que le calcul de l'expression du récepteur provoque un effet secondaire) alors pourquoi permettre à l'utilisateur de taper du code sans signification?
Sur le VB de l'équipe de conception, ils ont de la valeur du code de travail la façon dont il voulait dire travailler la première fois que vous avez tapé à la machine; si quelque chose semble un peu douteux, peut-être de donner un avertissement, mais de permettre et d'avancer.
Si vous êtes intéressé par certains de la plus subtile des problèmes dans la conception de la statique des appels en C#, voici une question intéressante:
http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx
Le compilateur C# ne vous permettra pas de faire référence à une propriété statique sur une instance d'un objet, seulement sur le type lui-même. C'est un C# plutôt que d'une .NET CLR restriction. VB.NET pour permettre à cet mais mettent en garde contre elle.