Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in Werttypen und Referenztypen in C#

Detaillierte Einführung in Werttypen und Referenztypen in C#

黄舟
黄舟Original
2017-10-01 07:24:471166Durchsuche

In diesem Artikel werden hauptsächlich die relevanten Informationen zu Werttypen und Referenztypen in C# ausführlich vorgestellt. Interessierte Freunde können darauf verweisen.

In C# sind Werttypen Referenztypen und Referenztypen zwei sehr wichtige Konzepte Das Verhalten von Typinstanzen muss beim Entwurf des Typs bestimmt werden. Wenn Sie beim Schreiben von Code den Unterschied zwischen Referenztypen und Werttypen nicht verstehen, werden unnötige Ausnahmen in den Code eingefügt. Viele Menschen stoßen im Programmierprozess auf viele Probleme, weil sie diese beiden Konzepte nicht verstehen. Hier spricht der Blogger kurz über das Verständnis von Werttypen und Referenztypen.

Konzeptionell speichert ein Werttyp zunächst seinen Wert direkt, während ein Referenztyp einen Verweis auf seinen Wert speichert. Daher werden die beiden Typen an unterschiedlichen Orten im Speicher gespeichert.

Zweitens arbeiten Werttypen aus Sicht des Speicherplatzes auf dem Stapel, während Referenztypen Speichereinheiten im Heap zuweisen.

Dem Stapel wird während der Kompilierung Speicherplatz zugewiesen, und der Stapel ist im Code klar definiert. Der Heap ist ein Speicherplatz, der während der Programmausführung dynamisch zugewiesen wird Status des Programms. Daher belegen Werttypen immer eine vordefinierte Anzahl von Bytes im Speicher. Eine Referenztypvariable weist einen Speicherplatz auf dem Stapel zu. Dieser Speicherplatz enthält einen Verweis auf einen anderen Speicherort. Dieser Speicherort ist eine Adresse im verwalteten Heap, an der der tatsächliche Wert der Variablen gespeichert ist.

Das heißt, der Werttyp entspricht Bargeld. Wenn Sie ihn verwenden möchten, verwenden Sie ihn einfach direkt, während der Indextyp einem Sparbuch entspricht zuerst zur Bank gehen, um es zu holen.

Werttypen reservieren jedoch Speicher auf dem Stapel, während Referenztypen Speicher auf dem verwalteten Heap zuweisen, was nur eine allgemeine Aussage ist. Dies wird im Folgenden ausführlich beschrieben.

(1) Wenn eine Instanz eines Werttyps als lokale Variable in einer Methode verwendet wird, wird sie auf dem Thread-Stack erstellt, wenn die Instanz als Mitglied des Typs verwendet wird wird als Teil des Typmitglieds zusammen mit anderen Typfeldern verwendet. Auf dem verwalteten Heap gespeichert.

Jeder Werttyp verfügt über einen impliziten Standardkonstruktor, der einen Standardwert für diesen Typ initialisiert. Zum Beispiel:


int i = new int();

entspricht:


Int32 i = new Int32();

entspricht:


int i = 0;

entspricht:


Int32 i = 0;

Bei Verwendung des neuen Operators der Standardkonstruktor eines bestimmten Typs aufgerufen werden und den Variablen Standardwerte zuweisen. Im obigen Beispiel weist der Standardkonstruktor i den Wert 0 zu.

Hinweis: Alle Werttypen in C# werden implizit von System.ValueType abgeleitet, und System.ValueType wird direkt von System.Object abgeleitet. Das heißt, System.ValueType selbst ist ein Klassentyp, kein Werttyp. Der Schlüssel liegt darin, dass ValueType die Equals-Methode überschreibt, sodass Werttypen anhand des Werts der Instanz und nicht anhand der Referenzadresse verglichen werden.

(2) Instanzen von Referenztypen werden auf dem verwalteten Heap erstellt.

Das Folgende ist ein Code, der den Unterschied zwischen Werttypen und Referenztypen im Detail erklärt


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值 
        } 
    } 
  }

Nachdem wir das obige Programm ausgeführt haben, haben wir Sie können Folgendes sehen: Wenn der Wert von Stamp_1.Age geändert wird, ändert sich das Alter nicht, aber nachdem der Wert von anders.Name geändert wird, ändert sich guru.Name. Dies ist der Unterschied zwischen Werttypen und Referenztypen. Wenn Sie die Variable vom Typ „Alter“ deklarieren, weisen Sie ihr den Wert von Stamp_1.Age zu. Zu diesem Zeitpunkt weist der Compiler einen Platz auf dem Stapel zu und füllt dann den Wert von Stamp_1.Age aus wie in Es ist dasselbe wie das Kopieren von Dateien auf dem Computer, außer dass der Wert von Stamp_1.Age in das Alter kopiert wird. Der Referenztyp ist unterschiedlich. Bei der Deklaration von Guru wird ihm Stamp_2 zugewiesen. Wie bereits erwähnt, enthält der Referenztyp nur einen Verweis auf die Adresse des Datenbereichs auf dem Heap , sie verweisen also auf denselben Speicherbereich. Da sie auf denselben Bereich verweist, ändert sich der Wert der anderen Karte entsprechend, genau wie bei einer Kreditkarte und einer Familienkarte: Wenn Sie mit einer Familienkarte Geld abheben, ändert sich auch das damit verbundene Kreditkartenkonto wird sich auch ändern.

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Werttypen und Referenztypen in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn