PDA

View Full Version : [Guida alle funzioni avanzate] - C#


gik25
18-03-2005, 17:06
Inizio inserendo qualche piccolo contributo.


Prestazioni
Esistono dei programmi chiamati profiler che permettono di analizzare il codice di un programma per trovare i colli di bottiglia. Forniscono in output il numero di volte che un'istruzione viene eseguita e il tempo impiegato (non è affidabilissimo).

Stringhe in cicli for
Se dovete eseguire un'istruzione mille volte la classe string non è adatta.

Vi faccio un esempio. Per tutti i file di un direttorio (1000) carica il testo in una stringa ed elimina i doppi spazi.

Un modo di farlo è eseguire
while(trovato_spazio_doppio)
{
stringa = stringa.Replace(" "," ");
}

Metodo in realtà pessimo e capace di impallarvi il computer per 20 secondi (per 100 file)!

Il metodo corretto è usare la classe StringBuilder.

Es.
StringBuilder stringa2 = new StringBuilder(stringa2)
while(trovato_spazio_doppio)
{
stringa2.Replace(" "," ");
}

si noti che mentre le stringhe sono oggetti immutabili passate sempre e solo per valore, gli oggetti StringBuilder sono passati solo ed esclusivamente per riferimento.

scrivere strnga2 = stringa2.Replace(" "," ") è un errore (in quanto rallenta di una decina di volte l'esecuzione del codice e non introduce alcuna differenza)

Utilizzare un oggetto modificandolo ma recuperare una copia intatta di esso alla fine del task

Se utilizzate un oggetto modificandone i campi perderete i valori originali. Anche se credevate di averli salvati. Per la precisione questo avviene se la modifica è fatta per riferimento.

Es.

object backup = originale;
ModificaPerRiferimento(originale);
originale = backup;
//scopro che originale è cambiato insieme a backup