it-swarm.com.de

Ist es "schlecht", öffentliche Konstanten zu haben?

Ist das:

public MyClass
{
    public const string SomeString = "SomeValue";
}

schlimmer als das:

public MyClass
{
    public static string SomeString { get{ return "SomeValue";}}
}

Beide können auf dieselbe Weise referenziert werden:

if (someString == MyClass.SomeString)
     ...

Die zweite hat jedoch den Schutz, ein Eigentum zu sein. Aber wie viel besser ist das wirklich als eine Konstante?

Ich habe immer wieder gelernt, wie gefährlich es ist, öffentliche Felder zu haben. Als ich Code sah, der diese Konstanten in öffentlichen Feldern verwendete, machte ich mich sofort daran, sie in Eigenschaften umzuwandeln. Aber auf halbem Weg fragte ich mich, welchen Vorteil es hatte, die statischen Eigenschaften gegenüber den Konstanten zu haben.

Irgendwelche Ideen?

39
Vaccano

In C # ist es aus keinem der in diesem Thread genannten Gründe sehr schlecht.

Öffentliche Konstanten in C # werden in referenzierende Assemblys gebacken. Wenn Sie also eine SomeOtherClass in einer separaten Assembly haben, die auf SomeString in MyClass verweist, enthält die für SomeOtherClass generierte CIL eine fest codierte Zeichenfolge "SomeValue".

Wenn Sie die DLL, die MyClass, aber nicht SomeOtherClass enthält, erneut bereitstellen und die Konstante ändern, enthält SomeOtherClass nicht das, was Sie denken - es enthält den ursprünglichen Wert.

Wenn Sie zu 100% sicher sind, dass es sich um eine universelle Konstante wie Pi handelt, werden Sie verrückt. Andernfalls vorsichtig vorgehen.

Hier ist eine bessere Erklärung: https://stackoverflow.com/questions/55984/what-is-the-difference-between-const-and-readonly

57
brian

Das Ändern eines Felds in eine Eigenschaft ist eine brechende Änderung. Sie verlieren die Kompatibilität mit Binärdateien, Quellen und Reflexionen.

In Ergänzung:

  • Es gibt eine feinkörnigere Zugriffskontrolle mit Eigenschaften. Muss es öffentlich zugänglich sein, möchte aber wirklich nur, dass es mit geschütztem Zugriff eingerichtet wird? Kein Problem (zumindest ab C # 2).
  • Möchten Sie in den Debugger einsteigen, wenn sich der Wert ändert? Fügen Sie einfach einen Haltepunkt in den Setter ein.
  • Möchten Sie alle Zugriffe protokollieren? Fügen Sie dem Getter einfach die Protokollierung hinzu.
  • Eigenschaften werden für die Datenbindung verwendet. Felder sind nicht.

http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx

Trotzdem sehe ich nicht, wie Konstanten davon wirklich betroffen sind (insbesondere wenn Sie keine der oben genannten Funktionen benötigen), es sei denn, Ihre API ändert sich so, dass sie keine Konstanten mehr sind.

22
Robert Harvey

Die Gefahr öffentlicher Felder besteht darin, dass sie veränderlich sind und dass sich die ihnen zugrunde liegende Implementierung ändern kann.

Wenn es um ein const geht, ist dies normalerweise kein Problem (ähnlich wie bei öffentlichen Aufzählungen) - es sei denn, Sie glauben, dass das const veränderlich wird und Sie eine Kapselung um den Accessor bei benötigen Einige Zeit (sagen wir, um zu protokollieren, wie oft es nachgeschlagen wurde), können Sie es genauso gut als öffentliches const behalten.

11
Oded

Eine Konstante sind Daten. Eigenschaften implizieren die Möglichkeit des Verhaltens, wenn Sie den Wert sogar "betrachten".

Das Bündeln des Verhaltens (oder der zukünftigen Möglichkeit davon) mit konstanten Daten ist absolut falsch. Für die meisten Systeme spielt es keine Rolle, aber es kann.

Nehmen wir an, der Wert ist "PI" und wird häufig in den Berechnungen des Systems verwendet. Wenn Sie es hinter Eigenschaften setzen, werden Client-Programmierer gezwungen, defensiv zu programmieren. Sie müssen den Wert einer doppelten Konstante zuweisen. Wenn sie nicht betrogen werden, kann in der nächsten Version der Bibliothek ein unerwünschtes "Verhalten" hinter der Eigenschaft auftreten. Das Verhalten der Eigenschaft (wenn sie sich in einer kompilierten Bibliothek befindet) ist unbekannt. Vielleicht funktioniert es im Test gut, aber es könnte versteckten Code geben, der ausgeführt wird, wenn eine spezielle Bedingung erfüllt ist. Dies ist keine vorzeitige Optimierung. Besonders für ein Echtzeitsystem hängt das Leben der Menschen ab.

Die Client-Programmierer verlieren möglicherweise sogar die Sicherheit einer Konstante, da die Sprache es ihnen möglicherweise nicht erlaubt, ihrer doppelten Konstante einen Eigenschaftswert zuzuweisen.

Wenn Programmierer gezwungen sind, Ihren Eigenschaftswert ihrer eigenen Konstante zuzuweisen, heben sie effektiv das Verhalten auf, das Sie mit Ihrer Eigenschaft erreichen wollten.

Echte konstante Daten benötigen oder wollen keine Kapselung.

1
Lord Tydus