Avere costanti pubbliche è "cattivo"?


39

È questo:

public MyClass
{
    public const string SomeString = "SomeValue";
}

peggio di così:

public MyClass
{
    public static string SomeString { get{ return "SomeValue";}}
}

È possibile fare riferimento a entrambi allo stesso modo:

if (someString == MyClass.SomeString)
     ...

Il secondo, tuttavia, ha la protezione di essere una proprietà. Ma davvero quanto è meglio di una const?

Ho imparato più e più volte i pericoli di avere campi pubblici. Quindi, quando ho visto del codice utilizzare queste costanti in campi pubblici, ho immediatamente iniziato a rifattorizzarle in proprietà. Ma a metà strada, mi sono chiesto quale beneficio fosse avere le proprietà statiche sulle costanti.

Qualche idea?


1
Le costanti pubbliche utilizzate in questo modo vanno bene. L'uso delle proprietà in questo modo è eccessivo.
Bernard,

2
Hai preso in considerazione l'utilizzo della parola chiave readonly ? ReadOnly ti dà la sintonia più pulita di una const senza i problemi menzionati in molti dei post.
Matt Raffel,

Potrebbe anche fare ... digitare in sola lettura statico statico constantName = 0;
Snoop

Risposte:


57

In C # è molto male per nessuno dei motivi menzionati in questo thread.

Le costanti pubbliche in C # vengono inserite negli assiemi di riferimento. Ciò significa che se si dispone di SomeOtherClass in un assembly separato che fa riferimento a SomeString in MyClass, il CIL generato per SomeOtherClass conterrà una stringa "SomeValue" codificata.

Se vai a ridistribuire la dll che contiene MyClass ma non SomeOtherClass e modifichi la const, SomeOtherClass non conterrà ciò che pensi che contenga - conterrà il valore originale.

Se sei positivo al 100% è una costante universale come Pi, impazzisci; altrimenti calpestare attentamente.

Ecco una spiegazione migliore: https://stackoverflow.com/questions/55984/what-is-the-difference-between-const-and-readonly


3
@Oded, ma la stessa differenza è tra constproprietà di sola lettura. constviene inserito nell'assembly chiamante, la proprietà di sola lettura no.
svick,

1
Questo è qualcosa che non sapevo. È un'ulteriore prova che i campi pubblici sono cattivi. Penso che anche l'esempio "sicuro" di Pi sia una cattiva idea (che dire di quando uno sviluppatore vuole più o meno cifre di precisione su Pi? E apporta la modifica all'assemblaggio senza conoscere questo problema.) Ho più di 40 assiemi nel mio soluzione e potrei vederlo davvero morderci se non stiamo attenti.
Vaccano,

2
Questa "copia" si verifica in altre parti di C #? (es. enums)
Vaccano,

2
Sì, la copia accade. Questo di solito non è un problema, ma se il codice utilizza il valore numerico di un Enum e viene modificato nel modo indicato in questa domanda, ciò può causare problemi.
Vaccano,

1
Questo è uno dei motivi principali per cui constin C # è stupido. Abbiamo bisogno di un supporto migliore per gli immutabili ...
KChaloux,

22

La modifica di un campo in una proprietà è un cambiamento decisivo. Si perde la compatibilità binaria, sorgente e di riflessione.

Inoltre:

  • C'è un controllo degli accessi più dettagliato con le proprietà. Hai bisogno che sia pubblicamente ottenibile, ma vuoi davvero che sia impostato solo con accesso protetto? Nessun problema (almeno da C # 2 in poi).
  • Vuoi entrare nel debugger ogni volta che il valore cambia? Aggiungi un punto di interruzione nel setter.
  • Vuoi accedere a tutti gli accessi? Aggiungi la registrazione al getter.
  • Le proprietà vengono utilizzate per l'associazione dei dati; i campi non lo sono.

http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx

Detto questo, non vedo come le costanti siano realmente influenzate da questo (specialmente se non hai bisogno di nessuna delle funzionalità di cui sopra), a meno che la tua API non cambi in modo tale da non essere più costanti.


11

I pericoli dei campi pubblici risiedono nel fatto che sono mutabili e che l'implementazione sottostante è soggetta a modifiche.

Quando si tratta di constquesto non è normalmente un problema (analogamente alle enumerazioni pubbliche) - a meno che non si pensi che constfinirà per essere mutabile e che occorrerà incapsulare intorno all'accessorio in qualche momento (dire per registrare quante volte è stato guardato in alto), potresti anche tenerlo come pubblico const.


1

Una costante sono i dati. Le proprietà implicano la possibilità di comportamento quando si "guarda" il valore.

Il comportamento del raggruppamento (o la sua possibilità futura) con dati costanti è completamente sbagliato. Per la maggior parte dei sistemi non importa davvero, ma può.

Diciamo che il valore è "PI" e ampiamente utilizzato nei calcoli del sistema. Metterlo dietro le proprietà costringerà i programmatori client a programmare in modo difensivo. Devono assegnare il valore in una costante duplicata. Se non eseguono il duplicazione, la versione successiva della libreria potrebbe presentare un "comportamento" indesiderato dietro la proprietà. Il comportamento della proprietà (se presente in una libreria compilata) non è noto. Forse funziona bene nel test, ma potrebbe esserci un codice nascosto che viene eseguito se viene soddisfatta una condizione speciale. Questa non è un'ottimizzazione pre-matura. Soprattutto per un sistema in tempo reale la vita delle persone dipende.

I programmatori client potrebbero persino perdere la sicurezza di una costante poiché la lingua potrebbe non consentire loro di assegnare un valore di proprietà nella loro costante duplicata.

Inoltre, quando i programmatori sono costretti ad assegnare il valore della tua proprietà alla propria costante, annullano efficacemente qualsiasi comportamento speravi di realizzare con la tua proprietà.

I dati con costante costante non richiedono né vogliono incapsulamento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.