61 votes

Comment déclarer une instance de classe comme une constante en C# ?

J'ai besoin de mettre cela en place :

static class MyStaticClass
{
    public const TimeSpan theTime = new TimeSpan(13, 0, 0);
    public static bool IsTooLate(DateTime dt)
    {
        return dt.TimeOfDay >= theTime;
    }
}

theTime est une constante (sérieusement :-), comme est que, dans mon cas, il serait inutile de le lire à partir des paramètres, par exemple. Et j'aimerais qu'il soit initialisé une fois et ne soit jamais modifié.

Mais C# ne semble pas permettre à une constante d'être initialisée par une fonction (ce qu'est un constructeur). Comment surmonter cette difficulté ?

73voto

ashelvey Points 1225

Utilisation de readonly au lieu de const peut être initialisé et ne plus être modifié par la suite. Est-ce que c'est ce que vous cherchez ?

Exemple de code :

static class MyStaticClass
{
    static readonly TimeSpan theTime;

    static MyStaticClass()
    {
        theTime = new TimeSpan(13, 0, 0);
    }
}

4 votes

Je l'utilise dans mon propre code, mais ma personnalité rétive sait qu'à chaque fois que je fais cela, il y a un objet vivant en mémoire de mon application. J'ai une application qui tourne depuis longtemps et qui utilise déjà trop de mémoire, et cela me dérange. J'aimerais qu'il y ait un TimeSpan littéral qui soit simplement compilé dans mon code. L'alternative est d'avoir un const int, convertissant ma valeur TimeSpan en milisecondes... mais les maths.

1 votes

Readonly n'est pas un analogue correct de const. Vous devriez plutôt utiliser static readonly, comme mentionné dans la réponse de James ci-dessous.

2 votes

@ashelvey J'ai trouvé cette page en cherchant un moyen constant de faire cela comme l'OP. Dans mon cas, readonly ne fonctionne pas, ni static. Je veux l'utiliser dans un attribut sur une propriété de classe - ce qui signifie que j'ai besoin d'une constante. (Je n'ai pas voté contre vous parce que ce n'est probablement pas possible, mais c'est une raison possible pour laquelle vous en avez obtenu).

50voto

James Gaunt Points 9541

Les constantes doivent être constantes au moment de la compilation, et le compilateur ne peut pas évaluer votre constructeur au moment de la compilation. Utilisez readonly et un static Constructeur .

static class MyStaticClass
{
  static MyStaticClass()
  {
     theTime = new TimeSpan(13, 0, 0);
  }

  public static readonly TimeSpan theTime;
  public static bool IsTooLate(DateTime dt)
  {
    return dt.TimeOfDay >= theTime;
  }
}

En général, je préfère initialiser dans le constructeur plutôt que par affectation directe car vous avez le contrôle sur l'ordre d'initialisation.

14voto

Etienne de Martel Points 16020

C# const n'a pas la même signification que celle de C++. const . En C#, const est utilisé pour définir essentiellement des alias aux littéraux (et ne peut donc être initialisé qu'avec des littéraux). readonly est plus proche de ce que vous voulez, mais gardez à l'esprit qu'elle n'affecte que l'opérateur d'affectation (l'objet n'est pas vraiment constant à moins que sa classe ait une sémantique immuable).

7 votes

Il convient de mentionner ici que static readonly champs peut peut être modifié par réflexion, tandis que const ne peut pas .

9voto

John Leehey Points 10405

Desde ce lien :

Les constantes doivent être un type de valeur (sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, ou bool), une énumération, un littéral de chaîne de caractères ou une référence à null. ou une référence à null.

Si vous voulez créer un objet, il faut le faire en tant que static readonly :

static class MyStaticClass
{
  public static readonly TimeSpan theTime = new TimeSpan(13, 0, 0);
  public static bool IsTooLate(DateTime dt)
  {
    return dt.TimeOfDay >= theTime;
  }
}

5voto

lance Points 6325
public static readonly TimeSpan theTime = new TimeSpan(13, 0, 0);

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