Maison  >  Article  >  développement back-end  >  Introduction détaillée aux types valeur et aux types référence en C#

Introduction détaillée aux types valeur et aux types référence en C#

黄舟
黄舟original
2017-10-01 07:24:471166parcourir

Cet article présente principalement en détail les informations pertinentes sur les types de valeur et les types de référence en C#. Il a certaines valeurs de référence. Les amis intéressés peuvent s'y référer

En C#, les types de valeur sont les types de référence et les types de référence. deux concepts très importants. Le comportement des instances de type doit être déterminé lors de la conception du type. Si vous ne comprenez pas la différence entre les types référence et les types valeur lors de l'écriture du code, des exceptions inutiles seront apportées au code. De nombreuses personnes rencontrent de nombreux problèmes dans le processus de programmation car elles ne comprennent pas ces deux concepts. Ici, le blogueur parle brièvement de la compréhension des types valeur et des types référence.

Tout d'abord, conceptuellement, un type valeur stocke sa valeur directement, tandis qu'un type référence stocke une référence à sa valeur. Ainsi les deux types sont stockés à des endroits différents de la mémoire.

Deuxièmement, du point de vue de l'espace mémoire, les types valeur opèrent sur la pile, tandis que les types référence allouent des unités de stockage dans le tas.

La pile se voit allouer de l'espace mémoire lors de la compilation, et la pile est clairement définie dans le code. Le tas est un espace mémoire alloué dynamiquement lors de l'exécution du programme. La taille de la mémoire peut être allouée dynamiquement en fonction de l'exécution. état du programme. Par conséquent, les types valeur occupent toujours un nombre prédéfini d’octets en mémoire. Une variable de type référence alloue un espace mémoire sur la pile. Cet espace mémoire contient une référence à un autre emplacement mémoire. Cet emplacement est une adresse dans le tas géré, où la valeur réelle de la variable est stockée.

C'est-à-dire que le type valeur est équivalent à de l'argent liquide, si vous souhaitez l'utiliser, utilisez-le directement, tandis que le type index est équivalent à un livret. Si vous souhaitez l'utiliser, vous l'avez. aller à la banque pour l'obtenir en premier.

Mais les types valeur allouent de la mémoire sur la pile, tandis que les types référence allouent de la mémoire sur le tas géré, ce qui n'est qu'une instruction générale. Ceci est décrit en détail ci-dessous.

(1) Pour une instance d'un type valeur, si elle est utilisée comme variable locale dans une méthode, elle est créée sur la pile de threads ; si l'instance est utilisée comme membre du type, elle est créée ; est utilisé dans le cadre du membre de type, avec d'autres champs de type stockés sur le tas géré.

Chaque type de valeur a un constructeur par défaut implicite qui initialise une valeur par défaut pour ce type. Par exemple :


int i = new int();

équivaut à :


Int32 i = new Int32();

équivaut à :


int i = 0;

est équivalent à :


Int32 i = 0;

Lors de l'utilisation de l'opérateur new, le constructeur par défaut d'un type spécifique sera appelé et attribuera des valeurs par défaut aux variables. Dans l'exemple ci-dessus, le constructeur par défaut attribue la valeur 0 à i.

Remarque : tous les types de valeur en C# sont implicitement dérivés de System.ValueType et System.ValueType est directement dérivé de System.Object. Autrement dit, System.ValueType lui-même est un type de classe, pas un type valeur. La clé est que ValueType remplace la méthode Equals afin que les types de valeur soient comparés en fonction de la valeur de l'instance au lieu de l'adresse de référence.

(2) Des instances de types de référence sont créées sur le tas géré.

Ce qui suit est un morceau de code pour expliquer en détail la différence entre les types valeur et les types référence


namespace Test 
  { 
      class Program 
      { 
        static void Main(string[] args) 
        { 
       //调用ReferenceAndValue类中的Demonstration方法 
          ReferenceAndValue.Demonstration(); 
          Console.ReadLine(); 
        } 
      } 
      public class stamp       //定义一个类 
      { 
        public string Name { get; set; }    //定义引用类型 
        public int Age { get; set; }    //定义值类型 
      } 
      public static class ReferenceAndValue   //定义一个静态类 
      { 
        public static void Demonstration()   //定义一个静态方法 
        { 
          stamp Stamp_1 = new stamp { Name = "Premiere", Age = 25 }; //实例化 
          stamp Stamp_2 = new stamp { Name = "Again", Age = 47 }; //实例化 
          int age = Stamp_1.Age;     //获取值类型Age的值 
          Stamp_1.Age = 22;     //修改值类型的值 
          stamp guru = Stamp_2;     //获取Stamp_2中的值 
          Stamp_2.Name = "Again Amend";   //修改引用的Name值 
          Console.WriteLine("Stamp_1's age:{0}", Stamp_1.Age); //显示Stamp_1中的Age值 
          Console.WriteLine("age's value:{0}", age); //显示age值 
          Console.WriteLine("Stamp_2's name:{0}", Stamp_2.Name); //显示Stamp_2中的Name值 
          Console.WriteLine("guru's name:{0}", guru.Name); //显示guru中的Name值 
        } 
    } 
  }

Après avoir exécuté le programme ci-dessus, nous Vous pouvez voir que lorsque la valeur de Stamp_1.Age est modifiée, l'âge ne change pas, mais une fois la valeur de anders.Name modifiée, guru.Name change. C'est la différence entre les types valeur et les types référence. Lors de la déclaration de la variable de type valeur age, attribuez-lui la valeur de Stamp_1.Age. À ce stade, le compilateur alloue un espace sur la pile puis remplit la valeur de Stamp_1.Age. Il n'y a aucun lien entre les deux, juste. comme dans C'est la même chose que copier des fichiers sur l'ordinateur, sauf que la valeur de Stamp_1.Age est copiée dans age. Le type de référence est différent. Stamp_2 est attribué à guru lors de sa déclaration. Comme mentionné précédemment, le type de référence ne contient qu'une référence à l'adresse de la zone de données sur le tas. En fait, la référence de Stamp_2 est également attribuée à guru, ils pointent donc vers la même zone mémoire. Puisqu'elle pointe vers la même zone, peu importe qui la modifie, la valeur de l'autre changera en conséquence. Tout comme une carte de crédit et une carte familiale, si vous retirez de l'argent avec une carte familiale, le compte de carte de crédit qui lui est associé. va également changer.

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn