2012-07-31 15 views
6

Gibt es einen Unterschied zwischen einer schreibgeschützten Eigenschaft mit:Read-only vs Auto (read-only) Eigenschaft

type T(arg) = 
    member x.M = arg 

und mit Hilfe eines automatisch implementiert Eigenschaft:

type T(arg) = 
    member val M = arg 

arg angenommen hat keine Nebenwirkungen? Irgendein Grund, eins über dem anderen vorzuziehen?

+0

In, gibt es nicht viel spürbaren Unterschied - Je nachdem, was verständlicher fühlt, wenn der Code als Ganze zu lesen. – 4444

Antwort

10

Der wesentliche Unterschied zwischen diesen ist, dass member val einen Ausdruck darstellt, der während der Instanzinitialisierung nur einmal berechnet wird. Daher ist die erste Überlegung die Leistung, also

type Person(fname, lname) = 
    member val Name = fname + lname // would be calculated once 

.

ist Eine weitere Überlegung auf zwei Einschränkungen von Autoeigenschaften:

  • Sie können sie nur in Typen mit primärem Ctor verwenden;
  • sie meiner Erfahrung sein kann zwischen ihnen nicht virtual
+0

Die Einschränkungen sind bemerkenswert. Vielleicht habe ich es nicht gut formuliert, aber ich wollte annehmen, dass "arg" ein einfacher Wert ist, wie zum Beispiel ein Literal. Das, soweit ich weiß, eliminiert den Kostenunterschied. – Daniel

+3

Ich bevorzuge die automatische Syntax für das Fehlen einer 'this' Referenz. Es macht deutlich, dass es weder das Objekt mutiert noch von anderen Mitgliedern abhängt. – Daniel