Antworten:
constimpliziert static(Sie benötigen keine Instanz, um auf den constWert zu verweisen ).
Ich möchte auch diesen wichtigen Punkt hinzufügen: Wenn Sie eine Assembly mit a verknüpfen (referenzieren) public const, wird dieser Wert in Ihre Assembly kopiert . Wenn sich also der constWert in der Assembly ändert, auf die verwiesen wird, hat Ihre Assembly weiterhin den ursprünglich kompilierten Wert.
Wenn dieses Verhalten nicht akzeptabel ist, sollten Sie in Betracht ziehen, das Feld zu einem public static readonlyFeld zu machen.
Lib.dll, als Binärdatei bereitgestellt:
public class Foo {
public const int HATS = 42;
public static readonly int GLOVES = 33;
}
App.exe, verweist auf Lib.dll:
Foo.HATS // This will always be 42 even if the value in Lib.dll changes,
// unless App.exe is recompiled.
Foo.GLOVES // This will always be the same as Foo.GLOVES in Lib.dll
Von MSDN :
Erstellen Sie keine Konstante, um Informationen darzustellen, von denen Sie erwarten, dass sie sich jederzeit ändern. Verwenden Sie beispielsweise kein konstantes Feld, um den Preis einer Dienstleistung, eine Produktversionsnummer oder den Markennamen eines Unternehmens zu speichern. Diese Werte können sich im Laufe der Zeit ändern. Da Compiler Konstanten weitergeben , muss anderer mit Ihren Bibliotheken kompilierter Code neu kompiliert werden, um die Änderungen zu sehen.
Von DotNetPerls :
DLLs. Wenn Sie ein
constFeld oder eine Deklaration verwenden, bettet der C # -Compilerconstden Wert der Variablen direkt in den IL-Code ein. Daher wird das im Wesentlichenconstals separate Einheit gelöscht.Achtung: Wenn Programme, die von a abhängen,
constnach derconstWertänderung nicht neu kompiliert werden, können sie beschädigt werden [ da sie weiterhin den vorherigen Wert verwenden ].
Eine Konstante ist per Definition statisch.
Konstanten können während der Kompilierung nicht im Code ersetzt werden, nicht zur Laufzeit. Daher sind keine statischen oder Instanzdefinitionen erforderlich.
Alle Konstantendeklarationen sind implizit statisch, und die C # -Spezifikation besagt, dass die (redundante) Aufnahme des statischen Modifikators verboten ist. Ich glaube, dies soll die Verwirrung vermeiden, die auftreten könnte, wenn ein Leser zwei Konstanten sehen würde, eine als statisch deklariert und eine nicht - sie könnten leicht annehmen, dass der Unterschied in der Spezifikation einen Unterschied in der Semantik impliziert. Es gibt jedoch kein Verbot, redundant einen Zugriffsmodifikator anzugeben, der auch der Standardmodifikator ist, bei dem eine Auswahl besteht. Beispielsweise kann eine (konkrete) Methode explizit als privat markiert werden, obwohl dies die Standardeinstellung ist. Die Regel scheint zu sein, dass der redundante Modifikator verboten ist, wenn keine Auswahl besteht (z. B. eine Methodendeklaration in einer Schnittstelle). Wo es eine Wahl gibt, ist es erlaubt.