View Full Version : [c#]Dubbio 'const' / 'static'
RaouL_BennetH
05-07-2010, 11:42
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.
astorcas
05-07-2010, 11:51
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.
In che senso capire la differenza? Le due cose sono piuttosto slegate fra loro. Il fatto che Environment.MachineName sia statico non garantisce che sia immutabile. Non puoi modificarla solo perché tale proprietà ha solo il getter.
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 :fagiano:
RaouL_BennetH
05-07-2010, 12:02
In che senso capire la differenza? Le due cose sono piuttosto slegate fra loro. Il fatto che Environment.MachineName sia statico non garantisce che sia immutabile. Non puoi modificarla solo perché tale proprietà ha solo il getter.
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 :fagiano:
Oppure, mi sa che mi sono spiegato male io :D
Per es.:
public const string pcName = Environment.MachineName;
public static string PcName()
{
return Environment.MachineName;
}
Il mio dubbio è:
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 ?
astorcas
05-07-2010, 12:21
Oppure, mi sa che mi sono spiegato male io :D
Per es.:
public const string pcName = Environment.MachineName;
public static string PcName()
{
return Environment.MachineName;
}
Il mio dubbio è:
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 ?
public const string pcName = Environment.MachineName;
ti darà errore di compilazione perché come ti ho detto nel post precedente const vuole un valore a compile time.
Per rispondere alla tua domanda ti posto un po' di codice che è meglio di mille sproloqui inutili :D
public class MieCostanti
{
private readonly string _pcName;
static MieCostanti()
{
_pcName = Environment.MachineName;
}
public static string PcName
{
get
{
return _pcName;
}
}
}
tomminno
05-07-2010, 12:31
Oppure, mi sa che mi sono spiegato male io :D
Per es.:
public const string pcName = Environment.MachineName;
public static string PcName()
{
return Environment.MachineName;
}
Il mio dubbio è:
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 ?
static e const hanno proprio una semantica differente, const è qualcosa che non puoi modificare, static è un qualcosa a cui puoi accedere ovunque tu ne abbia visibilità.
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.
RaouL_BennetH
05-07-2010, 12:59
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.
Originariamente inviato da tomminno
Se opti per la variabile pubblica (sconsigliato) allora static e const (o readonly, dipende da come ti torna meglio gestire la variabile).
In che modo quindi potrei restituire quei valori ?
Grazie sempre :)
RaouL.
astorcas
05-07-2010, 13:03
In che modo quindi potrei restituire quei valori ?
Grazie sempre :)
RaouL.
1) Dichiari variabili readonly (private e statiche)
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 :)
RaouL_BennetH
05-07-2010, 17:09
1) Dichiari variabili readonly (private e statiche)
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 :)
Ok, ho però un altro piccolo dubbio:
nel costruttore:
public class EnvInfo
{
private readonly string pcName;
private readonly string userName;
//bla
static EnvInfo()
{
pcName = Environment.MachineName;
//non ho visibilità di "pcName"
}
}
Come mai ?
Grazie :)
RaouL.
PS: L'errore che ottengo è:
A readonly field cannot be assigned to (except in a constructor or a variable initializer)
Ovviamente non succede se non uso "static"
astorcas
05-07-2010, 17:14
Ok, ho però un altro piccolo dubbio:
nel costruttore:
public class EnvInfo
{
private readonly string pcName;
private readonly string userName;
//bla
static EnvInfo()
{
pcName = Environment.MachineName;
//non ho visibilità di "pcName"
}
}
Come mai ?
Grazie :)
RaouL.
nel costruttore statico (o qualsiasi metodo statico) puoi accedere solo a variabili statiche. Magari dovresti approfondire il significato del modificatore static :)
in pratica devi scrivere:
private static readonly string pcName;
private static readonly string userName;
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.