Zugreifen auf gebundene Felder von statischen Elementen

8

Gibt es eine Möglichkeit, auf gebundene Felder von einem statischen Member zuzugreifen? Der folgende gibt den angezeigten Fehler:

%Vor%

Während private explizite Felder den Zugriff von statischen Mitgliedern erlauben:

%Vor%

Die Dokumentation Ссылка gibt an, dass "explizite Felder noch nicht für Routinezwecke gedacht sind" Der Zugriff auf private Instanzfelder von statischen Membern ist sicherlich ein Routine-Szenario. Außerdem glaube ich nicht, dass Sie explizite Felder innerhalb eines primären Konstruktors setzen können, was bedeutet, dass, wenn auf ein privates Instanzfeld von einem statischen Mitglied zugegriffen werden muss, alle Felder in explizite Felder verschoben werden müssen und nicht mehr Verwenden Sie einen primären Konstruktor - es ist alles oder nichts.

Als Beispiel für eine reale Welt, in der Sie tatsächlich von einem statischen Element aus auf ein privates Instanzfeld zugreifen möchten, sollten Sie eine große Integer-Implementierung in Betracht ziehen: Eine BigInteger-Klasse wäre unveränderlich, sodass die interne Darstellung der großen Ganzzahl als private Instanz beibehalten würde Feld (nennen wir es data ). Angenommen, Sie fanden eine Add(other) -Instanzmethode für eine unveränderbare Datenstruktur ungeeignet und wollten nur eine statische Add(lhs,rhs) -Methode implementieren: In diesem Fall müssten Sie auf lhs.data und rhs.data zugreifen können. .

    
Stephen Swensen 23.06.2010, 04:31
quelle

2 Antworten

6

Ich glaube nicht, dass Sie das können ... Tatsächlich können Sie auch von anderen Instanzen auf die gebundenen Werte nicht zugreifen:

%Vor%

Wenn Sie auf einen solchen Wert von außerhalb der Instanz zugreifen müssen, zu der er gehört, sollten Sie entweder eine private Eigenschaft erstellen, um den Wert zu erhalten, oder stattdessen ein privates Feld.

UPDATE Dies wird durch Abschnitt 8.6.2 der Spezifikation . Insbesondere:

  

Instanz "let" -Bindungen sind lexikalisch (und somit implizit privat) für das zu definierende Objekt.

Vielleicht wird jemand aus dem F # -Team eine definitive Antwort darauf geben, warum sich die Sprache so verhält. Ich kann mir jedoch einige mögliche Gründe vorstellen:

  1. let-bound-Werte dürfen nicht einmal als Felder vorhanden sein (z. B. aus der spec, eine let-Bindung wird durch ein local zum Konstruktor dargestellt), wenn der Wert keine syntaktische Funktion ist, nicht änderbar und nicht verwendet wird in irgendeiner Funktion oder Mitglied ")
  2. Dies scheint mit dem Verhalten von Let Bindings anderswo in der Sprache übereinzustimmen. Sehen Sie sich die Beispiele einer ungefähr äquivalenten Klasse und Datensatzdefinitionen an, die ich weiter unten eingefügt habe (weil ich nicht in der Lage bin, Codeblöcke innerhalb einer geordneten Liste richtig zu formatieren ...)
  3. Dies bietet eine feinkörnigere Verkapselungsebene, als dies in vielen anderen Sprachen möglich ist - Bindungen, die lokal zu dem zu definierenden Objekt sind. Andere Instanzen benötigen häufig keinen Zugriff auf diese Bindungen. In diesem Fall ist es sinnvoll, sie nicht verfügbar zu machen.
  4. Wenn Sie etwas wollen, auf das andere Instanzen Ihrer Klasse (oder aus statischen Methoden) zugreifen können, gibt es eine einfache Möglichkeit - erstellen Sie ein privates Feld oder eine private Eigenschaft, was den Vorteil hat, dass Sie ausdrücklich Ihre Absicht zum Ausdruck bringen Wert von außerhalb der Instanz zugänglich sein, in der Sie sich befinden.

Wie bereits erwähnt, sind hier eine ungefähr äquivalente Klassendefinition und Methode zum Erstellen eines Datensatzes:

%Vor%

Da Konstruktoren in F # konzeptionell ähnlich wie jede andere Funktion sind, die eine Instanz eines Typs zurückgibt (z. B. können sie ohne new aufgerufen werden), ist der Aufruf von MyClass 5 konzeptionell ähnlich dem Aufruf von makeMyRecord 5 . Im letzteren Fall erwarten wir eindeutig nicht, dass es eine Möglichkeit gibt, auf die lokale Bindungsbindung für j von einer anderen Instanz des Datensatzes zuzugreifen. Daher ist es konsistent, dass wir im ersten Fall auch keinen Zugriff auf die Bindung haben.

    
kvb 23.06.2010, 04:39
quelle
0
  

noch, Zugriff auf gebundene Felder von   statische Mitglieder sind sicherlich eine Routine   Szenario

Was meinst du hier? Was ist das entsprechende C # -Szenario (mit einem Beispiel)?

Beachten Sie, dass dies legal ist:

%Vor%

Das heißt, Sie können den übergebenen Wert als privates Element verfügbar machen, das ein statisches Element lesen / verwenden kann.

    
Brian 23.06.2010 14:40
quelle

Tags und Links