3
votes

Une énumération peut-elle être nulle en C #?

Vous vous demandez simplement si un enum peut être nul en C #?

Plus précisément, je m'intéresse à l'implémentation HttpStatusCode de enum en C #.

Que se passera-t-il si je n'attribue pas de valeur à une variable du HttpStatusCode type? Que se passera-t-il si j'essaie d'attribuer une valeur qui n'est pas attendue?


6 commentaires

Oui, si vous le rendez nullable.


Les énumérations en elles-mêmes ne peuvent pas être nulles, car ce sont des types valeur. Vous pouvez utiliser ? ou Nullable pour définir un type de valeur nullable , qui est un concept différent, vous pouvez donc utiliser HttpStatusCode pour obtenir une telle énumération nullable, mais l'énumération elle-même ne peut pas être null seule. Cependant, Nullable est un wrapper ce qui signifie que le type est maintenant autre chose, c'est un "porteur de données", donc une énumération nullable est en fait "quelque chose qui peut être nul, ou contenir une valeur d'énumération ", elle-même n'est plus une énumération.


Si vous ne lui attribuez pas de valeur, ce sera 0 qui ne correspond pas directement à un HttpStatusCode .


Les Enums sont des types valeur et ne peuvent pas être nuls. Vous pouvez utiliser Nullable pour encapsuler votre énumération. Dans votre cas, vous pouvez probablement simplement définir 0 pour représenter l'état incorrect.


créez une énumération et attribuez-lui null et voyez si cela fonctionne. Où est la curiosité de voir par vous-même?


Si vous attribuez une valeur qui ne figure pas dans la liste, elle agit simplement comme un int . Il n'y a pas de validation.


3 Réponses :


2
votes

Pas à moins que vous ne rendiez votre variable de type Nullable (ou MyEnum? ).

Sous le capot, les énumérations sont des entiers. Lorsqu'une énumération n'est pas initialisée, elle a la valeur default (int) , qui est 0 .

Modifier: d'autres types sous-jacents sont possibles, mais la valeur par défaut est int . Quel que soit le type sous-jacent que vous utilisez, une énumération non initialisée sera toujours la valeur par défaut du type sous-jacent.

Lorsque vous n'attribuez pas de valeurs entières à votre énumération, la première option sera définie sur 0 et donc être la valeur par défaut.

public enum MyEnum { Foo = 1, Bar = 2, Baz = 3 }

MyEnum myEnum;

if(myEnum == MyEnum.Foo) //false
if(myEnum == MyEnum.Bar) //false
if(myEnum == MyEnum.Baz) //false

Lorsque vous affectez des valeurs entières à votre énumération, et qu'il n'y a pas de valeur 0 (ou non attribuée), alors votre énumération non initialisée ne correspondra à aucune des options.

public enum MyEnum { Foo, Bar, Baz }

MyEnum myEnum;

if(myEnum == MyEnum.Foo) //true 
if(myEnum == MyEnum.Bar) //false
if(myEnum == MyEnum.Baz) //false


0 commentaires

3
votes

Depuis MSDN :

Chaque type d'énumération a un type sous-jacent, qui peut être n'importe quel type intégral sauf char. Le type sous-jacent par défaut des éléments d'énumération est int. Pour déclarer une énumération d'un autre type intégral, tel que byte, utilisez deux points après l'identificateur suivi du type, comme illustré dans l'exemple suivant. C #

enum Day: byte {Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri};

Les types approuvés pour une énumération sont byte, sbyte, short, ushort, int, uint, long ou ulong.

Comme ce ne sont que des types valeur, l'énumération elle-même ne peut pas être null.

Bien sûr, vous pouvez l'envelopper dans un Nullable , qui permet aux types valeur de se comporter" nullable ", mais techniquement, Nullable est un type de structure générique (non nullable) et non une énumération en soi, c'est juste un wrapper comme par définition:

public struct Nullable<T> where T : struct


0 commentaires

3
votes

Énumération HttpStatusCodes

Dans votre question particulière sur les HttpStatusCodes .

Ce qui se passe en fait, c'est que l'énumération "conviviale pour les lecteurs de code" telle que StatusCodes.400NotFound est juste une représentation d'une valeur entière de 400 . Vous pouvez simplement utiliser manuellement une valeur entière comme argument si vous le souhaitez, mais quelqu'un d'autre lisant votre code peut ne pas comprendre le code d'état HTTP.

Par exemple, si je viens d'écrire dans mon code le code d'état 422 , est-il facile à lire / comprendre? Probablement pas une bonne idée. Une personne lisant votre code aura de meilleures chances si vous utilisez StatusCode.422UnprocessableEntity .

Quels sont les codes d'état HTTP valides?
Si vous renvoyez une réponse HTTP, vous pouvez désigner n'importe laquelle des valeurs entières répertoriées ici ... https: //en.wikipedia.org/wiki/List_of_HTTP_status_codes

Comportement (s) non attribué (s) ou par défaut?
Sans savoir quelle méthode ou quel serveur vous utilisez, votre question sur "que se passe-t-il s'il n'est pas attribué". La réponse habituelle est que le serveur répondra par défaut avec un code d’état 200 (OK).

Utilisation de codes de réponse non standard
Cela dépend vraiment de ce que vous faites, mais l'utilisation de valeurs de code de réponse qui ne font pas partie de la norme (ex. -999) peut (ou non) une erreur, mais vous devez éviter cela car ce n'est pas une norme prise en charge.

Enum Nullable

Pour HttpStatusCodes dans tous les cas (que j'aie jamais rencontrés), vous ne pouvez pas attribuer une valeur null à la HttpResponse car le type de propriété est un entier .

Notez que ce que je dis est spécifique à l'attribution d'une valeur de code d'état à un objet HttpResponse. Vous pouvez lire les autres réponses sur la question générique des énumérations nullables.


0 commentaires