statico/condiviso in VB.NET e C# Visibilità
-
22-09-2019 - |
Domanda
Ho affrontato una situazione in VB.NET e C# (.NET2) con la visibilità dei membri statici/condivisi. Mi sembra un po 'strano in vb.net:
public class A
{
private static A instance;
public static A Instance
{
get { return instance; }
}
public string Name { get { } }
}
utilizzo:
A.Instance.Name
// Solo il nome è "visibile"
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
utilizzo:
A.Instance.Instance.Instance.Instance...
// Il membro condiviso si comporta come un pubblico di classe che posso ripeterlo in infinito ..
È una supervisione di Microsoft o una "funzione" VB.NET?
Soluzione
Non è una svista ma il tuo codice VB volere Attiva un avvertimento, che significa chiaramente: non utilizzare questa notazione.
In VB, membri statici Potere accedere tramite un'istanza, da quando a rigor di termini, VB non ha static
: VB ha la parola chiave Shared
, nel senso che il membro è condivisa tra tutti i casi, al contrario di static
Dove un membro non appartiene qualunque esempio.
Ora, questa è una distinzione semantica tra quelle parole chiave. Accade così che queste due semantiche distinte tendono ad avere lo stesso effetto.
Certo, static
In C# è oggi identico a Shared
in vb.net ma la loro eredità è diversa e VB Shared
ha semplicemente una storia diversa e quindi storicamente un significato diverso. Insieme a questo Significa, ha assolutamente senso accedere Shared
membri tramite un'istanza.
Ha anche senso se usato insieme a Option Strict Off
(digitazione sciolta): qui, a volte Non lo so un tipo di variabile ma potresti comunque voler accedere a Shared
membro. Ora, non hai altra scelta che usare un'istanza per accedervi:
Option Strict Off
' … '
Dim o As Object = New A()
' Somewhere else, we want to access a static member of A but we don’t know A: '
Dim instance = o.Instance
Altri suggerimenti
È una caratteristica; Questo non è un bug. VB funziona come progettato. Lingue diverse fanno scelte diverse sul fatto che un metodo statico possa essere trattato come un metodo di istanza o meno. VB lo consente. C ++ lo consente. C# no.
Ricorda, i criteri di progettazione delle diverse lingue sono diversi e quindi le decisioni prese sono diverse. Nel team di progettazione C#, apprezziamo fortemente una definizione linguistica che rende sospetti schemi illegali; Dal momento che non c'è no significato passare un'istanza come ricevitore su un metodo statico (a meno che non calcola l'espressione del ricevitore non provoca un effetto collaterale), perché consentire all'utente di digitare il codice insignificante?
Nel team di progettazione VB, apprezzano il codice funzionante Il modo in cui intendevi funzionare La prima volta che l'hai digitato; Se qualcosa sembra un po 'ingannevole, forse dai un avvertimento, ma lascialo e vai avanti.
Se sei interessato ad alcuni dei problemi più sottili nella progettazione di chiamate statiche in C#, ecco un problema interessante:
http://blogs.msdn.com/ericlippert/archive/2009/07/06/Color-Color.aspx
Il compilatore C# non consentirà di fare riferimento a una proprietà statica su un'istanza di un oggetto, solo sul tipo stesso. Questa è una restrizione C# piuttosto che una .NET. VB.NET lo permetterà, ma avvertirà contro di esso.