68 votes

Valeur initiale d'un Enum

J'ai une classe avec une propriété qui est un enum.

L'enum est

/// <summary>
/// All available delivery actions
/// </summary>
public enum EnumDeliveryAction
  {
    /// <summary>
    /// Tasks with email delivery action will be emailed
    /// </summary>
    Email,

    /// <summary>
    /// Tasks with SharePoint delivery action 
   /// </summary>
   SharePoint
  }

Lorsque je crée une instance de cette classe, je ne spécifie nulle part dans le code la valeur du champ enum, mais il semble que la valeur par défaut soit le premier élément de l'enumlist, et non une valeur nulle, est-ce ainsi que les enums fonctionnent ? Comment est-il possible de s'assurer que l'enum obtient une sorte de valeur nulle s'il n'est pas défini, je ne veux pas qu'il prenne par défaut la première valeur de l'enum.

114voto

Mehrdad Afshari Points 204872

Valeur par défaut pour enum Les types sont 0 (qui est par défaut, le premier élément de l'énumération). Les champs d'une classe seront initialisés à la valeur par défaut.

Si vous devez représenter un inconnu dans l'énumération, vous pouvez ajouter un élément Unknown avec la valeur 0. Vous pouvez également déclarer le champ comme Nullable<MyEnum> ( MyEnum? ).

10voto

Josh Kodroff Points 6646

Les Enums sont un type de valeur, comme les ints. Vous devez le rendre nullable afin de ne pas utiliser par défaut le premier membre de l'enum (ou celui qui est défini par 0).

public class MyClass
{
   public EnumDeliveryAction? DeliveryAction { get; set;}
}

9voto

Marc Gravell Points 482669

Les champs d'une enum sont initialisés à zéro ; et si vous ne spécifiez pas de valeurs dans une enum, ils commencent à zéro ( Email = 0 , SharePoint=1 etc).

Ainsi, par défaut, tout champ que vous initialisez vous-même sera Email . Il est relativement courant d'ajouter None=0 pour de tels cas, ou alternativement utiliser Nullable<T> ; c'est-à-dire

/// <summary>
/// All available delivery actions
/// </summary>
public enum EnumDeliveryAction
{
    /// <summary>
    /// Not specified
    /// </summary>
    None,

    /// <summary>
    /// Tasks with email delivery action will be emailed
    /// </summary>
    Email,

    /// <summary>
    /// Tasks with SharePoint delivery action 
   /// </summary>
   SharePoint
}

Vous devez également vous assurer de ne jamais traiter votre dernier attendu comme valeur par défaut ; c'est-à-dire

switch(action) {
    case EnumDeliveryAction.Email; RunEmail(); break;
    default: RunSharePoint(); break;
}

ça devrait être :

switch(action) {
    case EnumDeliveryAction.Email; RunEmail(); break;
    case EnumDeliveryAction.SharePoint; RunSharePoint(); break;
    default: throw new InvalidOperationException(
          "Unexpected action: " + action);
}

8voto

Winston Smith Points 12029

La meilleure pratique (telle que conseillée par Code Analysis) est de toujours avoir une valeur par défaut dans vos enums, qui représentent une valeur non définie.

Donc dans votre cas, vous pourriez avoir :

public enum EnumDeliveryAction
   {

    /// <summary>
    /// Default value
    /// </summary>
    NotSet,

    /// <summary>
    /// Tasks with email delivery action will be emailed
    /// </summary>
    Email,

    /// <summary>
    /// Tasks with SharePoint delivery action 
   /// </summary>
   SharePoint
  }

Soit dit en passant, vous ne devriez pas faire précéder le nom de l'enum par Enum. Vous pourriez envisager de le changer en :

public enum DeliveryAction;

1voto

Mitch Wheat Points 169614

Vous pouvez faire commencer vos enums à n'importe quelle valeur (comme 1), mais lorsqu'ils représentent une valeur de consultation dans une base de données, vous voulez généralement qu'ils correspondent.

En général, je déclare la première Enum comme None ( = 0) lorsque cela a un sens, conformément aux directives de conception du .Net Framework.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X