|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[c#]Dubbio 'const' / 'static'
Ciao a tutti
Ho questo piccolo dubbio che mi attanaglia: Devo implementare una classe che restituisce soltanto, sotto forma di stringhe, i dati del pc connesso all'applicazione, dati tipo nome pc, indirizzo ip locale etc... Ho considerato questi dati come immutabili per tutta la durata dell'applicazione e da qui il mio dubbio. Considerando che dalla documentazione letta su msdn, ho notato che le classi che forniscono i metodi per ottenere questo tipo di informazioni sono tutti statici (es. string pcName = Environment.MachineName). Mi\Vi chiedo quindi in che modo posso capire la differenza tra const e static (in questo caso). grazie mille RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Quote:
E' probabile comunque che Environment.MachineName punti ad una variabile privata che è statica e readonly (dubito che sia const, perché andrebbe definita in fase di compilazione, invece readonly ti consente di valorizzarla a run time, nel costruttore (in questo caso statico)) Mi sa che ho fatto casino
|
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Per es.: Codice:
public const string pcName = Environment.MachineName;
public static string PcName()
{
return Environment.MachineName;
}
Considerando che i dati come nome pc, indirizzo ip, nome utente etc.. durante tutta l'applicazione non variano mai, è più corretto pensarli come costanti o statici ?
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Quote:
Codice:
public const string pcName = Environment.MachineName; Per rispondere alla tua domanda ti posto un po' di codice che è meglio di mille sproloqui inutili Codice:
public class MieCostanti
{
private readonly string _pcName;
static MieCostanti()
{
_pcName = Environment.MachineName;
}
public static string PcName
{
get
{
return _pcName;
}
}
}
|
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Se non cambiano sono const (o readonly). Se static o meno dipende dalla logica con cui vuoi usarle, in questo caso propenderei per una proprietà get static. const serve a poco dato che non hai un metodo set e che le stringhe vengono copiate. Se opti per la variabile pubblica (sconsigliato) allora static e const (o readonly, dipende da come ti torna meglio gestire la variabile). Per lo meno relativo all'esempio che hai postato, magari in un contesto differente la scelta migliore potrebbe essere un'altra. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Mmm... credo di iniziare a vedere un pò più chiaro, ma forse è meglio se descrivo nello specifico ciò che mi è stato assegnato:
In pratica all'avvio dell'applicazione devo fornire dei metodi per identificare: Il computer L'utente (inteso come nome utente del pc) il gruppo di lavoro al quale appartiene L'ip dell'utente l'orario di avvio dell'applicazione. Tralasciando l'ultima, avevo interpretato proprio quei valori come costanti e immutabili. Ecco perchè avevo pensato a definire delle costanti. Ho poi visto però che non è possibile definire una costante (se non a compile time come indicatomi) così come avevo postato qualche esempio fa e la cosa mi ha aumentato la già notevole confusione che ho al riguardo. Quote:
Grazie sempre RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Quote:
2) Valorizzi le variabili nel costruttore statico (readonly ti permette di farlo), il costruttore statico di una classe viene chiamato una sola volta in tutto il ciclo di vita dell'applicazione, e così sei sicuro che quelle variabili saranno valorizzate un'unica volta. 3) Crei una proprietà pubblica e statica solo con il get accessor Almeno è quello che farei io, come vedi dal codice postato in precedenza |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
nel costruttore: Codice:
public class EnvInfo
{
private readonly string pcName;
private readonly string userName;
//bla
static EnvInfo()
{
pcName = Environment.MachineName;
//non ho visibilità di "pcName"
}
}
Grazie RaouL. PS: L'errore che ottengo è: Codice:
A readonly field cannot be assigned to (except in a constructor or a variable initializer)
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
Ultima modifica di RaouL_BennetH : 05-07-2010 alle 17:15. |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Quote:
in pratica devi scrivere: Codice:
private static readonly string pcName; private static readonly string userName; |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:41.




















