Risposte:
constimplica static(non è necessaria un'istanza per fare riferimento al constvalore).
Voglio aggiungere anche questo punto importante: quando si collega a (riferimento) un assembly con a public const, quel valore viene copiato nell'assembly. Quindi, se il constvalore nell'assembly a cui si fa riferimento cambia, l'assembly avrà ancora il valore originariamente compilato.
Se questo comportamento non è accettabile, dovresti considerare di trasformare il campo in un public static readonlycampo.
Lib.dll, fornito come binario:
public class Foo {
public const int HATS = 42;
public static readonly int GLOVES = 33;
}
App.exe, fa riferimento a 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
Da MSDN :
Non creare una costante per rappresentare le informazioni che ti aspetti di cambiare in qualsiasi momento. Ad esempio, non utilizzare un campo costante per memorizzare il prezzo di un servizio, il numero di versione di un prodotto o il nome del marchio di un'azienda. Questi valori possono cambiare nel tempo e, poiché i compilatori propagano le costanti , altro codice compilato con le librerie dovrà essere ricompilato per vedere le modifiche.
Da DotNetPerls :
DLL. Quando si utilizza un
constcampo o una dichiarazione, il compilatore C # incorpora effettivamente ilconstvalore della variabile direttamente nel codice IL. Pertanto, essenzialmente cancella ilconstcome entità separata.Attenzione: se i programmi che dipendono da a
constnon vengono ricompilati dopo laconstmodifica del valore, potrebbero interrompersi [ perché continueranno a utilizzare il valore precedente ].
Una costante è statica per definizione.
Le costanti non possono essere sostituite nel codice durante la compilazione, non durante il runtime, quindi non sono richieste definizioni statiche e di istanza.
Tutte le dichiarazioni di costanti sono implicitamente statiche e la specifica C # afferma che l'inclusione (ridondante) del modificatore statico è vietata. Credo che questo sia per evitare la confusione che potrebbe verificarsi se un lettore vedesse due costanti, una dichiarata statica e l'altra no - potrebbe facilmente presumere che la differenza nella specifica implicasse una differenza nella semantica. Detto questo, non vi è alcun divieto di specificare in modo ridondante un modificatore di accesso che è anche quello predefinito, dove c'è una scelta. Ad esempio, un metodo (concreto) può essere contrassegnato esplicitamente come privato nonostante sia l'impostazione predefinita. La regola sembra essere che dove non c'è scelta (ad esempio una dichiarazione di metodo in un'interfaccia) il modificatore ridondante è proibito. Dove c'è una scelta, è permesso.