Existe-t-il un moyen plus rapide de vérifier s’il s’agit d’une date valide?

Y at-il un moyen plus rapide d’attraper une exception comme ci-dessous?

try { date = new DateTime(model_.Date.Year, model_.Date.Month, (7 * multiplier) + (7 - dow) + 2); } catch (Exception) { // This is an invalid date } 

 Ssortingng DateSsortingng = Ssortingng.Format("{0}/{1}/{2}", model_.Date.Month, (7 * multiplier) + (7 - dow) + 2),model_.Date.Year); DateTime dateTime; if(DateTime.TryParse(DateSsortingng, out dateTime)) { // valid } 

Comme le commentaire souligné par GenericTypeTea, ce code ne fonctionnera pas plus vite que ce que vous avez maintenant. Cependant, je pense que vous gagnez en lisibilité.

Si votre objective est d’éviter d’utiliser des exceptions, vous pouvez écrire une méthode de validation personnalisée:

 public bool IsValidDate(int year, int month, int multiplier, int dow) { if (year < 1 | year > 9999) { return false; } if (month < 1 | month > 12) { return false; } int day = 7 * multiplier + 7 - dow; if (day < 1 | day > DateTime.DaysInMonth(year, month)) { return false; } return true; } 

Ceci effectue la plupart des mêmes validations que le constructeur DateTime que vous utilisez. Il omet simplement le contrôle pour voir si le DateTime résultant est inférieur à DateTime.MinValue ou supérieur à DateTime.MaxValue.

Si vous obtenez principalement de bonnes valeurs, cela sera probablement plus lent dans l’ensemble: DateTime.DaysInMonth doit faire la même chose que le constructeur DateTime, ce qui augmenterait le temps de traitement de toutes les bonnes dates.

Hmm … pensez de cette façon: la classe model_ a une propriété DateTime

 model_.Date 

, donc pas besoin de valider l’année et le mois. La seule partie délicate est le jour du mois:

 (7 * multiplier) + (7 - dow) + 2 

Donc, un moyen très rapide et efficace de valider cela (ce qui est mieux que de lancer et attraper) consiste à utiliser la méthode DateTime.DaysInMonth:

 if ((multiplier <= 4) && (DateTime.DaysInMonth(model_.Date.Year, model_.Date.Month) < (7 * multiplier) + (7 - dow) + 2)) { // error: invalid days for the month/year combo... } 

Un autre avantage est que vous n'avez pas besoin d'instancier un nouveau DateTime pour valider ces informations.

Post- scriptum Mise à jour le code pour s'assurer que multiplicateur est <= 4. Cela n'a de sens, puisque toute valeur> = 5 échouera le test DaysInMonth ...

Regardez la méthode DateTime.TryParse

EDIT : Woops! DateTime.TryParse ne lève pas d’exception en interne. Je parlais mes fesses! En tous cas…

DateTime.TryParse() lèvera une exception en interne et provoquera un résultat identique à votre code dans votre question. Si la vitesse est importante, vous devrez écrire votre propre méthode.

Cela peut sembler être plus de code, mais je pense que ce sera plus rapide si vous vous attendez à un grand nombre d’erreurs:

 public bool GetDate(int year, int month, int day, out DateTime dateTime) { if (month > 0 && month <= 12) { int daysInMonth = DateTime.DaysInMonth(year, month); if (day <= daysInMonth) { dateTime = new DateTime(year, month, day); return true; } } dateTime = new DateTime(); return false; } 

Mon exemple ci-dessus ne traitera pas tous les cas (c.-à-d. Que je ne gère pas des années), mais cela vous indiquera la bonne direction

Je ne sais pas plus vite, mais

 DateTime.TryParse() 

Devrait faire la même chose.

Je serais intéressé si quelqu’un peut me dire si cela est plus rapide (en termes de temps de processeur) que la manière décrite dans la question.

Une chose cependant: les exceptions sont exceptionnelles. Les chaînes Bogoformatted ne sont pas exceptionnelles, mais attendues. TryParse est donc plus approprié.

Utiliser try / catch pour vérifier la validité est un abus et une idée fausse des exceptions, en particulier avec un catch-all catch (ce dernier m’a déjà amené à chercher pendant des heures pourquoi quelque chose ne fonctionnait pas et tant de fois).

Si le mécanisme d’parsing n’est pas plus rapide, vous pouvez utiliser la méthode légèrement plus détaillée de vérification directe des propriétés de votre object de modèle pour les valeurs valides.