Question

Dans Delphi, s’il existait une exception lors de la construction d’un objet: toute mémoire allouée serait libérée et une exception serait levée. Par exemple, il était garanti de retourner un objet Camera valide ou d'exécuter une exception:

Camera c = new Camera();

Vous jamais n'avez pas dû vérifier la variable résultante pour obtenir la valeur null:

Camera c = new Camera();
if (c == null)
   throw new Exception("Error constructing Camera") //waste of time

Est-ce la même chose dans le CLR?

Et y a-t-il d'autres constucts syntatiques dans lesquels une valeur de retour est garantie soit valide, soit émet une exception?

  • Création de structures (rectangle, par exemple)?
  • obtenir un membre d'une énumération?
  • le résultat de Object.ToString ()?
  • opérations mathématiques?

Dans le cas de l'exécution de mathématiques:

Int32 aspect = 1650.0 / 1080.0;
if (aspect == null) 
   throw new Exception("Division of two numbers returned null")
Était-ce utile?

La solution

Un constructeur en .Net est garanti pour renvoyer une instance non nulle du type de l'objet. Que l'instance soit ou non valide , cela dépend de la sémantique individuelle du type.

Les exceptions levées dans un constructeur ne seront pas arbitrairement avalées par le CLR (bien que le code utilisateur puisse les avaler). Le CLR propagera une exception, tout comme les exceptions lancées dans une autre méthode, et les objets seront finalement correctement récupérés.

En ce qui concerne les autres cas que vous avez mentionnés

  • Création de structures: Par définition, les structures ne peuvent jamais être nulles. Les exceptions levées dans le constructeur se propagent normalement
  • Obtention d'un membre d'une énumération: les énumérations sont des types strutures / value sous le capot et ne seront jamais non plus nulles
  • le résultat de Object.ToString (): Cela peut (et sera malheureusement) nul. String est un type de référence et il est parfaitement légal de renvoyer null à partir d'une substitution ToString (veuillez ne pas le faire).
  • Opérations mathématiques: Cela dépend fortement du paramètre de débordement de votre projet et du type particulier utilisé (intégrale ou virgule flottante).

La question mathématique mérite presque une réponse seule. D'une part, le résultat d'une opération mathématique sur des types primitifs ne sera jamais nul. Mais cela peut toujours être invalide. Par exemple, le code suivant ne jettera pas, mais que le résultat soit valide ou non dépend fortement de votre scénario spécifique

float f1 = 1.0;
float f2 = f1 / 0;

À ce stade, f2 est une valeur flottante très spécifique qui ne représente pas un nombre réel. Est-ce valide? Cela dépend de votre cas d'utilisation.

Autres conseils

Oui. J'aimerais le formuler de cette façon ( fail pourrait aussi vouloir dire échec logique ): si un constructeur ne lève pas d'exception, la valeur de retour est garantie. non - null afin que vous n'ayez jamais à effectuer une telle vérification.

Création de structures (rectangle, par exemple): Un struct ne peut pas être Nullable du tout (les types typeof(int?) != typeof(int) sont considérés comme des types complètement différents, c.-à-d. enum). L'appel d'un constructeur pour une structure échouerait soit en lançant une exception, soit en renvoyant une instance.

Obtention d'un membre d'une énumération: Un Object.ToString() est simplement un ensemble de constantes. Il n'y a rien de tel que & "; Obtenir un membre au moment de l'exécution. &"; Il est substitué à la compilation.

Résultat de string: comme toute méthode, elle peut renvoyer n'importe quelle valeur valide pour le type Int32 qui inclut <=> et peut également renvoyer une exception (dans ce cas, elle ne renvoie aucune valeur ).

Opérations mathématiques: toutes les expressions renverront une valeur ou lèveront une exception. La valeur de retour peut être toute valeur valide pour ce type (par exemple, <=> ne peut jamais être <=>).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top