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é ?

3voto

George Kargakis Points 968

La constante représente un membre statique dont la valeur ne peut jamais changer. Cela signifie qu'une valeur constante est définie au moment de la compilation.
Avec la déclaration :

    public const TimeSpan theTime = new TimeSpan(13, 0, 0);

Sont violés deux axiomes des champs constants :

  • Seuls les types intégrés de C# (à l'exception de System.Object) peuvent être déclarés comme const.
  • La valeur de l'iniatialisation doit être évaluée au moment de la compilation.

Dans la question, le type TimeSpan est utilisé, ce qui n'est pas le cas. intégré (prédéfini) Type. Cela signifie que le compilateur csc.exe ne peut pas le reconnaître.
Si vous utilisez un type C# intégré (par exemple String) et que vous voulez initialiser le membre constant avec une valeur de compilation, vous obtenez toujours une erreur : par exemple

 public const string MyNumber = SetMyString();
 private string SetMyString()
 {
  return "test";
 }

Résoudre le problème que vous pouvez déclarer un membre avec :

static readonly

si vous souhaitez déclarer un champ une seule fois au moment de l'exécution :

public static readonly string MyNumber = SetMyString();
private static string SetMyString()
{
 return "test";
}

1voto

Rudresh Bhatt Points 1715

Vous pouvez utiliser le mot clé readonly :

Lorsqu'une déclaration de champ comprend un modificateur de lecture seule, les affectations à les champs introduits par la déclaration ne peuvent se produire qu'en tant que partie de la déclaration ou dans un constructeur de la déclaration. ou dans un constructeur de la même classe.

Exemple (copié de la page MSDN liée) :

class Age
{
    readonly int _year;
    Age(int year)
    {
        _year = year;
    }
    void ChangeYear()
    {
        //_year = 1967; // Compile error if uncommented.
    }
}

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