Laden...

Globale Konstanten

Erstellt von plumperquatsch vor 18 Jahren Letzter Beitrag vor 18 Jahren 7.989 Views
P
plumperquatsch Themenstarter:in
27 Beiträge seit 2005
vor 18 Jahren
Globale Konstanten

Hallo mal wieder...

Ich komme ursprünglich - rein Hobbymäßig - von Delphi und dort ist es möglich, Konstanten zu definieren, auf die ich zugreifen kann, wenn ich eine Quelldatei in einer anderen bekannt mache.

Nun möchte ich in C# so etwas erreichen.
Ich möchte eine Möglichkeit haben, Konstante Werte zu definieren und im Projekt zu nutzen, ohne eine Klasse erzeugen zu müssen. Geht das? In der Hilfe habe ich nichts gefunden und hier im Forum auch nicht. Oder ich weiß nicht die richtigen Stichwörter...
Oder bin ich auf 'nem total falschen Dampfer? 🤔

Danke für Eure Geduld,

Jens

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo plumperquatsch,

Ich möchte eine Möglichkeit haben, Konstante Werte zu definieren und im Projekt zu nutzen, ohne eine Klasse erzeugen zu müssen.

ohne Klasse geht das nicht, höchstens als enum (und das ist letztendlich auch eine Klasse).

Aber mit Klasse geht es schon:


public class A {
   public const String B = "huhu";
}

Zugriff außerhalb der Klasse mit A.B

herbivore

D
462 Beiträge seit 2005
vor 18 Jahren

Hallo herbivore!

Impliziert die const-Deklaration, dass die Konstante statisch ist oder muss man zuerst ein Object von A erstellen um auf B zugreifen zu können (kann es leider gerade nicht selbst testen). Ich habs bisher immer mit

public static readonly string B = "huhu"

gemacht.

Aber welche Version ist bevorzugen?

mfg DeveloperX

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo DeveloperX,

ja, const inpliziert static. Wenn es sich wirklich um eine Konstante (also im Sinne von Literal) handelt, würde ich const nehmen. readonly braucht man, wenn man die Konstante erst zu Laufzeit (im Konstruktor) berechnen muss. Und readonly ist m.E. auch nicht automatisch static.

herbivore

P
plumperquatsch Themenstarter:in
27 Beiträge seit 2005
vor 18 Jahren

Ich danke Euch!!!

S
8.746 Beiträge seit 2005
vor 18 Jahren

Achtung! Die Verwendung von Konstanten ist kritisch. Klassisches Versionierungsproblem. Das ist in "statischen" Sprachen wie Delphi oder C++ meist unkritisch, aber bei .NET und den gerne verwendeten PlugIns oft tödlich.

Besser: Statische Funktionen oder Get-Properties, den den Wert zurückliefern. Das ist in jedem Fall die sauberste Lösung.

1.271 Beiträge seit 2005
vor 18 Jahren

Hallo svenson,

Das ist sehr interessant. Kannst du aber bitte noch ein bisschen genauer darauf eingehen, warum es so schlimm ist? Ich danke dir.

Gruß,
progger

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

4.221 Beiträge seit 2005
vor 18 Jahren

Wie wäre es mit Enumerations ? (für numerische Werte)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

M
1.439 Beiträge seit 2005
vor 18 Jahren

const wird wird während des compilierens ausgewertet, ähnlich wie public static final in java.
=>Annahme class a deklariert ein Feld c als const und class b verwendet a.c.
Compilierst du class b funktioniert alles, änderst du nun a.c ohne class b neu zu übersetzen, hat class b noch immer den alten Wert von a.c.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Beispiel: Du hast ein Assembly A, welche eine Konstante K veröffentlicht. Nun kommt Assembly B daher und benutzt die Konstante von A im Code. Dies geschieht dadurch, dass der Wert, z.B. K=5, direkt (quasi als Kopie) in den Code von B eingefügt wird. Zur Laufzeit findet keinerlei Zugriff mehr von B auf A statt.

Das ist gut für die Performance, aber schlecht, wenn (nur) A durch ein Update ausgetauscht wird. Hat in diesem Update die Konstante den Wert geändert, z.B. auf K=6, so rechnet B immer noch mit dem alten Wert, also 5 weiter.

Das nennt man Versionierungsproblem. Aus diesem Grund gibt es in C# auch keine optionalen Parameter (die Default-Werte optionaler Parameter werden wie Konstanten behandelt). Warum man nicht so konsequent war, öffentliche Konstanten zu verbieten, kann ich mir nur dadurch erklären, dass es bisher keine Zugriffsmodifizierer auf Assembly-Ebene gab.

Daraus leitet sich der Tipp ab: Konstanten nur (Assembly-) intern zu verwenden (was man meist tut, daher fällt einem das Problem auch kaum auf).

Das gilt prinzipiell für alle Programmiersprachen. In Zeiten, wo Anwendungen aus einer großen Exe und vielleicht 1-2 Dlls bestanden, war das wenig problematisch. Heute aber, geht der Trend zu losen gekoppelten Modulen.

Mit "Konstantenfunktionen" ist man immer auf der sicheren Seite, allerdings ist es halt nicht ganz so schnell.