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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top