E' possibile modificare i valori dei campi dichiarati in una classe in...

giovedì 02 ottobre 2008 - 18.33

-*Web_Horse*- Profilo | Junior Member

E' possibile modificare i campi di una classe in runtime?

Ad esempio io dichiaro un mio namespace con la relativa classe:
namespace a.namespace
{
public class classe
{
public bool c = true;
}
}
io vorrei fare in modo che quel valore bool, sia modificabile dall'esterno, ad esempio da una mia pagina asp.net:

using a.namespace;
classe Classe = new classe();
protected void Page_Load(object sender, EventArgs e)
{
qui modifico il valore del bool c
*false
}

Ho provato diversi modi, ma con esito negativo, cioé nella pagina il valore veniva restituito false, ma in generale restava sempre true.

Aggiungo: ho provato anche utilizzando il modificatore get set creando un'interfaccia specifica, ma non può essere implementato
alla perferzione all'interno di un'istanza if(), quindi, non sono riuscito a completare questo test.

Come posso fare per impostare quel valore in modo che possa essere modificato in runtime?

Grazie.




rossimarko Profilo | Guru

Ciao,

il problema da te segnalato è dovuto al fatto che in ogni pagina dichiari una nuova istanza della classe, che quindi avrà come valore di default quello da te impostato:
classe Classe = new classe();

Se ti serve avere una istanza globale a livello di processo allora dichiara la variabile e la classe come static (http://msdn.microsoft.com/en-us/library/98f28cdx.aspx) e non avrai più la necessita di creare un'istanza della classe per accedervi, ma basterà
classe.c = false;

e questo valore verrà mantenuto tra le varie pagine. Occhio però che questo valore è condiviso con tutti gli utenti, non so se è questa la tua esigenza..
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

-*Web_Horse*- Profilo | Junior Member

***Ciao, ho modificato la classe secondo il criterio static, ma non da il risultato sperato, perché,
quando richiamo la classe ed inserisco il punto, mi restituisce nell'intellisense soltanto i metodi Equals() e ReferenceEquals()
mentre non mi restituisce nessuno dei campi specificati*** <<<sbagliato

Avevo dimenticato di dichiarare anche la variabile in modo static, ora lo trova.

Adesso provo e ti faccio sapere se funziona.

-*Web_Horse*- Profilo | Junior Member

A quanto pare questo metodo sembra funzionare, perché il valore resta quello modificato,
ma come mai quando vado a controllare il file.cs dove é dichiarato il campo, questo non risulta modificato,
bensi rimane sempre quello dichiarato inizialemente?

-*Web_Horse*- Profilo | Junior Member

Ovviamente il tutto mi serve per non caricare il database di query inutili per ottenere questo tipo di notifiche.
La classe che uso é come se dovesse farmi da database per alcune variabili, per questo, una volta che vengono cambiate,
devono restare tali per sempre, fino a nuovo ordine.

rossimarko Profilo | Guru

>Ovviamente il tutto mi serve per non caricare il database di
>query inutili per ottenere questo tipo di notifiche.
>La classe che uso é come se dovesse farmi da database per alcune
>variabili, per questo, una volta che vengono cambiate,
>devono restare tali per sempre, fino a nuovo ordine.

Le variabili statiche servono appunto per contenere un unico valore comune a tutta l'applicazione. Questo è valido a livello di processo quindi nel caso di un sito web finchè il processo del sito rimane attivo il valore non verrà perso.

All'interno dei siti web una funzionalità analoga la puoi ottenere con l'oggetto application: http://msdn.microsoft.com/en-us/library/system.web.httpapplicationstate.aspx

L'unica cosa da tenere in considerazione delle due soluzioni che ti ho detto è che le informazioni da memorizzare non devono essere troppo grosse (ad esempio delle datatable con centinaia di righe) perchè in questo caso si consiglia di usare la cache di asp.net (http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx)
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

-*Web_Horse*- Profilo | Junior Member

No no, mi serve solo per avere a disposizione piccole variabili, come i valori booleani, per ottenere le relative notifiche.
Ad esempio, il valore bool che ho specificato poco fa(impostato su false) mi serve per ottenere una notifica all'interno di una pagina di amministrazione:
if (!mybool)
{
layout1.visible = false;
label.text= "il valore é impostato su false";
}
else
{
layout1.visible = true
label.text= "il valore é impostato su true";
}

Il valore false mi servirà solo per una volta, o per casi eccezionali, per questo gradirei che fosse modificato in modo definitivo all'interno della classe.

Adesso andrò ad approfondire il link che mi hai suggeriro riguardo httpapplicationstate.

-*Web_Horse*- Profilo | Junior Member

Sono un idiota. Se volessi potrei utilizzare anche web.config per questo scopo utilizzando configuration manager e la sezione application setting.

***Comunque, mi sembra di aver capito che l'ApplicationState é volatile, cioé che i dati possono andare persi in caso si avvii il processo di Garbage Collection,
o ho capito male?***< si, avevo capito bene, ho letto poco fa il paragrafo riguardo la memeoria volatile.

rossimarko Profilo | Guru

>Sono un idiota. Se volessi potrei utilizzare anche web.config
>per questo scopo utilizzando configuration manager e la sezione
>application setting.

Uhmm.. Occhio che nel web.config di solito si mettono dei parametri di configurazione che non sono modificabili, perchè ogni modifica fatta al web.config ti riavvia l'applicazione.

>***Comunque, mi sembra di aver capito che l'ApplicationState
>é volatile, cioé che i dati possono andare persi in caso si avvii
>il processo di Garbage Collection,
>o ho capito male?***< si, avevo capito bene, ho letto poco
>fa il paragrafo riguardo la memeoria volatile.

Per quanto riguarda la perdita dei dati devi fare alcune considerazioni. Prima di tutto bisogna capire se questi valori di notifica devono rimanere salvati per sempre o meno.
Mi spiego meglio: quando tu imposti una variabile statica o un item all'interno di HttpContext.Application questo valore rimane attivo fino a quando è attivo il processo del sito web. Il problema è che un sito web non è sempre attivo. In IIS 6 l'impostazione di default è che venga fatto lo shutdown del processo dopo 20 minuti di inattività.
Facendo un esempio pratico:
- entri nel sito
- setti il valore della variabile
- vai nella pagina di amministrazione e vedi che il valore della variabile è settato correttamente
- per 20 minuti nessuno accede più all'applicazione web --> viene fatto lo shutdown
a questo punto se rientri nel sito la variabile sarà valorizzata con il valore di default e non con quello settato prima (questo vale anche per le session e gli altri oggetti legati al processo)

Se la tua necessità è quella di avere il flag valorizzato anche in questo caso allora l'unica cosa che puoi fare è salvare i dati su db (o alla peggio su filesystem, ma se hai un db forse è meglio). In quel caso qualsiasi riavvio (potrebbe anche darsi che venga riavviato IIS per motivi di manutenzione) non ti comporterebbe nessun problema perchè il dato è stato salvato
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

-*Web_Horse*- Profilo | Junior Member

Ciao, alla fine ho anche tralasciato il web.congif ed optato direttamente per sql database,
tanto non é una query tanto critica.

Grazie del supporto.

A presto.

rossimarko Profilo | Guru

>Ciao, alla fine ho anche tralasciato il web.congif ed optato
>direttamente per sql database,
>tanto non é una query tanto critica.

Allora si, direi che è la soluzione più rapida e indolore.

>Grazie del supporto.

Figurati!

PS: puoi accettare una risposta nel thread così viene chiuso?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

-*Web_Horse*- Profilo | Junior Member

SI, ok..
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5