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?
3 Réponses :
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
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
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 utilisezStatusCode.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. p>
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.
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
?
ouNullable
pour définir un type de valeur nullable , qui est un concept différent, vous pouvez donc utiliserHttpStatusCode
pour obtenir une telle énumération nullable, mais l'énumération elle-même ne peut pas êtrenull
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 à unHttpStatusCode
.Les
Enums
sont des types valeur et ne peuvent pas être nuls. Vous pouvez utiliserNullable
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.