Maison  >  Article  >  développement back-end  >  Expliquez la différence entre les mots clés const et readonly en C#

Expliquez la différence entre les mots clés const et readonly en C#

WBOY
WBOYavant
2023-09-15 16:33:021040parcourir

Expliquez la différence entre les mots clés const et readonly en C#

En C#, les mots-clés const et readonly sont utilisés pour définir des valeurs immuables qui ne peuvent pas être modifiées une fois déclarées. Il existe cependant des différences importantes entre les deux. Le modificateur

const

const déclare des valeurs constantes qui sont connues au moment de la compilation et ne changent pas, c'est-à-dire qu'elles sont immuables. En C#, seuls les types intégrés peuvent être marqués const. Les types définis par l'utilisateur (tels que les classes, les structures, etc.) ne peuvent pas être const. De plus, les types de membres de classe (tels que les méthodes, les propriétés ou les événements) ne peuvent pas être marqués comme constantes.

Vous devez initialiser les constantes lors de la déclaration.

class Period{
   public const int hours = 12;
   public const int minutes = 60;
}

Les constantes peuvent être marquées avec n'importe quel modificateur de visibilité, c'est-à-dire privé, public, protégé, protégé interne ou privé protégé.

Les constantes agissent également comme des valeurs statiques, c'est-à-dire que la valeur de la constante est associée à toutes les instances de la classe. Vous n'êtes pas obligé de les marquer explicitement à l'aide du mot-clé static. Vous ne pouvez pas accéder aux constantes à l'aide des variables d'instance de la classe, vous devez utiliser le nom de la classe.

Les champs marqués en lecture seule ne peuvent être déclarés que ou dans un constructeur. Une fois qu'une instance d'une classe est créée, les champs en lecture seule ne peuvent pas être modifiés.

Si le champ est de type valeur, le marquer en lecture seule le rend immuable. D'un autre côté, si le champ en lecture seule est de type référence, vous pouvez toujours modifier les données de l'objet auquel la variable fait référence. Toutefois, vous ne pouvez pas modifier la référence pour pointer vers un nouvel objet.

class Person{
   private readonly string _title;
   private readonly string _skill;
   public Person(string title, string skill){
      _title = title;
      _skill = skill;
   }
}

Les champs en lecture seule peuvent être attribués plusieurs fois dans la déclaration de champ et dans n'importe quel constructeur. De plus, il peut avoir des valeurs différentes selon le constructeur utilisé.

Une différence importante entre les deux est que les champs const ou readonly déclarés dans un assembly seront compilés lorsqu'ils seront utilisés dans un autre assembly.

  • Pour les valeurs const, c'est comme rechercher et remplacer. La valeur constante est « intégrée » dans le langage intermédiaire du deuxième assembly. Cela signifie que si vous mettez à jour la constante, le deuxième assembly aura toujours la première valeur jusqu'à ce que vous le recompiliez.

  • Pour les valeurs en lecture seule, c'est comme une référence à un emplacement mémoire. La valeur n’est pas intégrée dans le langage intermédiaire du deuxième assembly. Cela signifie que si l'emplacement mémoire est mis à jour, le deuxième assembly obtiendra la nouvelle valeur sans recompilation. La mise à jour d'un champ en lecture seule signifie que seul le premier assembly doit être compilé, et non les assemblys utilisateur.

  • Exemple

    Démonstration en temps réel

    using System;
    class Program{
       static void Main(){
          Console.WriteLine(Period.HOURS);
          var person = new Person("John", "Programmer");
          person.Print();
       }
    }
    class Period{
       public const int HOURS = 12;
       public const int MINUTES = 60;
    }
    class Person{
       private readonly string _title;
       private readonly string _skill;
       public Person(string title, string skill){
          _title = title;
          _skill = skill;
       }
       public void Change(string skill){
          // Error: A readonly field cannot be assigned to
          // this._skill = skill;
       }
       public void Print(){
          Console.WriteLine($"{_title}: {_skill}");
       }
    }

    Sortie

    12
    John: Programmer

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer