ciao, dato che devi lavorare con numeri interi evita il tipo double, se possibile. Infatti i calcoli in virgola mobile in certi casi *potrebbero* darti
problemi di arrotondamento.
Prova invece a fare il calcolo usando le sole proprietà .Year, .Month e .Day degli oggetti DateTime, che sono degli interi.
Ad esempio potresti fare:
//calcolo la differenza degli anni
var eta = dtaDiag.Year - dtaNas.Year;
//e se il compleanno non è ancora trascorso, allora tolgo l'anno che non ha ancora compiuto
if (dtaNas.Month >= dtaDiag.Month && dtaNas.Day >= dtaDiag.Day)
eta--;
return eta;
Invece, a proprosito del parsing delle date, potresti usare il metodo
DateTime.TryParse che è
molto più efficiente di un blocco try... catch. Lo dico così, eh, dato che hai chiesto un parere. In realtà non noterai alcuna differenza nelle prestazioni dato che devi solo parsare due date. Tuttavia, quella di usare TryParse resta una buona pratica.
Poi, (giusto come appunto) sii cosciente che se hai utenti internazionali potrebbero inserire date in formati diversi dal nostro e quindi il parsing deve rispettare questa preferenza dell'utente. Invece, se hai solo utenti italiani, puoi fregartene della globalizzazione e assicurarti solamente che la cultura in uso dall'applicazione sia sempre quella italiana.
return -1;
Anche qui, se possibile, evita i cosiddetti "numeri magici", cioè i numeri a cui la tua applicazione dà un significato speciale.
Restituisci null, se la funzione non riesce ad effettuare il calcolo. Puoi usare un
tipo nullable come valore di ritorno.
//uso byte perché è difficile che una persona abbia più di 255 anni :)
private byte? EtaDiagnosi(string dtaNascita, string dtDiagnosi)
In ultimo, non dare per scontato che dtaDiag sia maggiore di dtaNas. Chi inserisce i dati può sbagliare a digitare e, se anche hai un meccanismo di validazione lato client, devi sempre ricontrollare che i valori ricevuti dalla funzione rispettino un certo criterio. Anche in questo caso, restituisci null.
ciao
Modificato da BrightSoul il 01 luglio 2012 16.50 -