2012-10-31 20 views
73

Sto cercando di dichiarare una costante PI come questo:La costante non può essere contrassegnato statica

public static const double PI = Math.PI; 

ma perché sto ottenendo questo errore?

The constant 'Calendar.NewCalendar.PI' cannot be marked static 
+1

Possibile duplicato http://stackoverflow.com/questions/408192/why-cant-i-have-public-static-const-string-s-stuff-in-my-class – himanshupareek66

risposta

156

const implica static (non è necessaria un'istanza per fare riferimento al valore const).

Desidero aggiungere anche questo punto importante: quando si collega (riferimento) a un assieme con un public const, tale valore è copiato nell'assieme. Pertanto, se il valore const nell'assieme di riferimento cambia, l'assembly avrà ancora il valore originariamente compilato.

Se questo comportamento è non accettabile, è consigliabile prendere in considerazione il campo come campo public static readonly.

lib.dll, fornito come binario:

public class Foo { 
    public const int HATS = 42; 
    public static readonly int GLOVES = 33; 
} 

App.exe, riferimenti 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 si prevede di modificare in qualsiasi momento. Ad esempio, non utilizzare un campo costante per memorizzare il prezzo di un servizio, un numero di versione del prodotto o il nome del marchio di un'azienda. Questi valori possono cambiare nel tempo e poiché i compilatori propagano le costanti, l'altro codice compilato con le librerie dovrà essere ricompilato per vedere le modifiche.

Da DotNetPerls:

DLL. Quando si utilizza un campo o una dichiarazione const, il compilatore C# incorpora in realtà il valore della variabile const direttamente nel codice IL. Pertanto, in pratica elimina il const come entità separata.

Attenzione: Se i programmi che dipendono da un const non vengono ricompilati dopo le const variazioni di valore, essi possono rompere [perché continueranno a utilizzare il valore precedente].

9

Non è possibile avere const statico. Prova a leggere invece di const o semplicemente rilascia "statico" poiché "const" è comunque statico implicito.

10

Una costante è statica per definizione.

+0

è applicato su' final' anche in Java –

+0

@ BasheerAL-MOMANI: No. Una finale è immutabile dopo la chiamata del costruttore. Niente di più. –

+0

aha quindi 'finale' è come 'sola lettura' ,,,, ho ragione? –

4

Le costanti non possono essere sostituite nel codice durante la compilazione, non nel runtime, quindi non c'è alcun requisito per le definizioni dell'istanza statica vs.

2

Tutte le dichiarazioni di costanti sono implicitamente statiche e la specifica C# indica che l'inclusione (ridondante) del modificatore statico è proibita. Credo che ciò sia per evitare la confusione che potrebbe verificarsi se un lettore vedesse due costanti, una dichiarata statica e una non - potrebbero facilmente presumere che la differenza nelle specifiche implicasse una differenza nella semantica. Detto questo, non vi è alcun divieto di specificare in modo ridondante un modificatore di accesso che è anche quello predefinito, in cui vi è una scelta. Ad esempio, un metodo (concreto) può essere esplicitamente contrassegnato come privato, nonostante sia l'impostazione predefinita. La regola sembra essere quella in cui non c'è scelta (ad esempio una dichiarazione di metodo in un'interfaccia) il modificatore ridondante è proibito. Dove c'è una scelta, è permesso.

Problemi correlati