Damit der C# -Compiler einen const
-Wert eines Strukturtyps erzeugt, muss er wissen, welche Werte in allen Feldern enthalten sein müssen. Der C# -Compiler weiß, wie man die Felder bestimmter Typen wie Decimal
initialisiert, aber für die meisten Werttypen hat er keine solchen Kenntnisse.
Es wäre möglich, dass ein Compiler ein Mittel zur Verfügung stellt, um konstante Werte eines Strukturtyps in Kontexten zu deklarieren, in denen alle struct
Felder exponiert sind. Wenn die Felder einer Struktur private
wären, könnten Konstanten dieses Typs dann nur innerhalb der Struktur deklariert werden; Wenn die Felder internal
wären, könnten Konstanten irgendwo in der Assembly deklariert werden; Wenn public
, könnten sie überall deklariert werden.
Obwohl ich gerne eine solche Funktion sehen würde, erwarte ich keine gängigen .net-Sprachen, um es zu implementieren. Benannte Konstanten von Typen, die der Compiler inhärent kennt, können an anderen konstanten Ausdrücken teilnehmen, während static readonly
Variablen nicht können. Wenn NumRows
eine Konstante gleich 4 ist, kann ein Ausdruck wie Arr[3*NumRows+7]
durch Arr[19]
ersetzt werden, auch wenn NumRows
in einer äußeren Baugruppe definiert ist.Dies gibt solchen Konstanten einen wesentlichen Vorteil gegenüber static readonly
Variablen. Wenn jedoch eine Konstante von einem Typ ist, den ein Compiler nicht an sich erkennt, hätte sie eine sehr begrenzte Fähigkeit, an irgendwelchen konstanten Ausdrücken teilzunehmen, was effektiv den Vorteil zunichte macht, dass sie überhaupt eine Konstante ist. Wenn eine Werttypkonstante ein exponiertes Feld hätte, wäre es einem Compiler möglich, den Wert dieses Feldes als Konstante zu verwenden, aber da die Ersteller von .net-Sprachen philosophisch gegen Strukturen mit exponierten Feldern sind, würde ich nicht erwarten sie, um eine solche Nutzung zu erlauben, selbst wenn sie es könnten.
Es gibt einige mögliche Anwendungsfälle für die Bevorzugung von Konstanten über static readonly
Variablen, aber viele solcher Fälle können mit vorhandenen Typen in akzeptabler Weise behandelt werden. Eine Bibliothek könnte beispielsweise eine const Int64
zur Verfügung stellen, um Informationen über ihre Version zu codieren, und diesen Wert als Standardparameterwert für eine GetLinkedVersionInfo
-Methode verwenden. Der fragliche Wert würde beim Kompilieren in den aufrufenden Code "eingebacken" werden, so dass die Methode berichten könnte, mit welcher Version der Bibliothek der Aufrufer verbunden war, und möglicherweise feststellen könnte, ob Kompatibilitätsprobleme mit der Version, die sie ausführt, vorhanden sind.
Sie können Strukturen const deklarieren. Klassen und Strukturen sind austauschbar und funktionieren für Klassen. – templatetypedef
@templatetypedef: Soll ich "anders als null" erwähnen. – Lazlo
@templatetypedef: Ich bin mir nicht sicher, welche Version von C# Sie verwenden, aber das trifft auf keine Version zu, die ich gesehen habe. – cdhowie