Lunghezza massima di una stringa

L’estate fa venire strani pensieri … perche’ le formiche hanno 6 zampe, perche’ Dio ha creato l’universo solo in una settimana e Microsoft non riesce a fare un buon sistema operativo in 5 anni … e tante altre. In una delle altre mi chiedo perche’ in C# la lunghezza di una stringa e’ una proprieta’ di tipo Int32. La lunghezza e’ un valore che puo’ essere solo >= di zero. Il ragionamento mi avrebbe portato a definirla come UInt32.

Inoltre averlo definito come Int32 mi limita la dimensione massima delle stringhe a 2,147,483,647 mentre con uint potrei avere stringhe di 4,294,967,295 caratteri. Ovviamente si puo’ obiettare che 4GB di stringa mandano in OutOfMemory l’heap ma da un punto di vista di purezza del modello mi incuriosisce il motivo che ha portato gli ingegneri della Microsoft a considerare solo un int.

Dopo una Close uno FileStream non necessita di Finalize

La Finalize e’ un metodo chiamato dal Garbage Collector sugli oggetti che devono essere distrutti per rilasciare in modo pulito le risorse tenute dall’oggetto stesso. Tuttavia se un oggetto candidato alla distruzione richiede la finalizzazione allora non viene distrutto immediatamente ma soltanto alla prossima esecuzione del GC.

Studiando la classe FileStream si nota che esiste il metodo Finalize che chiude lo stream e svuota i buffer. Tuttavia quando uso la classe di solito mi ritrovo a chiamare il metodo Close quando finisco di usare l’oggetto FileStream e guarda caso la Close fa le stesse cose della Finalize. Questo significa che nonostante la chiamata alla Close il Garbage Collector chiamera’ la Finalize sull’oggetto che non dovra’ fare nulla poiche’ ho gia’ fatto io Close ma avra’ l’effetto di ritardare la distruzione effettiva dell’oggetto al prossimo giro del GC.

Per rendere immediata la distruzione dell’oggetto allora dopo la Close dovrei aggiungere una GC.SuppressFinalize come nel codice seguente.

string path = Path.Combine(
Environment.GetFolderPath(
Environment.SpecialFolder.MyDocuments), "test.dat");

FileStream fs = newFileStream(path, FileMode.Create);
fs.WriteByte(1);
fs.Close();
GC.SuppressFinalize(fs);