Objekt als Referenz übergeben in C#

Muhammad Maisam Abbas 11 Dezember 2023
  1. Übergabe von Variablen per Wert an eine Funktion in C#
  2. Variablen per Referenz an eine Funktion in C# übergeben
  3. Übergeben Sie Objekte unter Bezugnahme auf eine Funktion in C#
Objekt als Referenz übergeben in C#

In diesem Lernprogramm werden die Methoden zum Übergeben eines Objekts an eine Funktion in C# erläutert.

Übergabe von Variablen per Wert an eine Funktion in C#

Alle Werttypvariablen werden in C# standardmäßig als Wert übergeben. Angenommen, wir übergeben eine Variable als Wert an eine Funktion und ändern diese Variable in der Funktion. In diesem Fall hat dies keine Auswirkung auf den Wert der Variablen, die in den Argumenten der Funktion übergeben wird. Was hier passiert, ist, dass eine separate Kopie der übergebenen Variablen im Speicher erstellt wird und alle Operationen an dieser bestimmten Kopie ausgeführt werden. Das folgende Codebeispiel zeigt uns, wie wir eine Werttypvariable als Wert in C# übergeben können.

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

Ausgabe:

New value = something
Original Value = Nothing

Im obigen Code haben wir die Zeichenkettenvariable valueType als Wert an die Funktion method1() übergeben, die der übergebenen Variablen einen neuen Wert zuweist. Zwei verschiedene Kopien von Variablen mit demselben Wert werden im Speicher erstellt, wenn wir die Variable valueType wertweise an die Funktion method1() übergeben. Und dann wird die zweite Kopie der Variablen auf den Wert something geändert. Diese zweite Kopie ist nur innerhalb der Funktion method1() zugänglich. Durch eine Änderung dieses zweiten Werts wird die ursprüngliche Variable valueType nicht geändert.

Variablen per Referenz an eine Funktion in C# übergeben

Wir können eine Werttypvariable auch als Referenz mit dem Schlüsselwort ref in C# übergeben. Das Schlüsselwort ref gibt an, dass ein Wert als Referenz übergeben an eine Funktion übergeben wird. Bei diesem Ansatz ist nur eine Kopie der Variablen im Speicher vorhanden, und ein separater Zeiger wird an die Funktion übergeben, die auf den Wert der Variablen zeigt. Das folgende Codebeispiel zeigt, wie Sie eine Werttypvariable als Referenz mit dem Schlüsselwort ref in C# übergeben.

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(ref string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(ref valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

Ausgabe:

New value = something
Original Value = something

Im obigen Code haben wir die Werttypvariable valueType unter Bezugnahme auf die Funktion method1() mit dem Schlüsselwort ref in C# übergeben. Die Funktion method1() nimmt als Argument einen Verweis auf die Variable valueType und ändert den Wert der Variablen valueType in something. Dieses Mal wird der ursprüngliche Wert geändert.

Übergeben Sie Objekte unter Bezugnahme auf eine Funktion in C#

Standardmäßig werden alle Referenztypvariablen wie Klasseninstanzen, Strukturinstanzen usw. als Referenz übergeben an die Funktionen in C#. Was hier passiert ist, dass das ursprüngliche Objekt niemals als Parameter an eine Funktion übergeben wird. Ein neuer Verweis auf das Objekt wird als Wert an die Funktion übergeben. Am Ende haben wir also zwei Kopien von Zeigern, die auf denselben Speicherort zeigen. Wenn wir den Wert dieses Zeigers ändern, wird auch der Wert des ursprünglichen Objekts geändert. Das folgende Codebeispiel zeigt, wie ein Objekt unter Bezugnahme auf eine Funktion in C# übergeben wird.

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      obj.s = "something";
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine(sam.s);
    }
  }
}

Ausgabe:

something

Im obigen Code haben wir das Objekt sam unter Bezugnahme auf die Funktion dosomething() übergeben, die die Eigenschaft s innerhalb des Objekts sam ändert. Es ändert den Wert des ursprünglichen sam-Objekts und weist der Eigenschaft sam.s something zu. Obwohl dies die Standardmethode zum Übergeben von Objekten als Referenz ist, gibt es eine Ausnahme von diesem Ansatz. Wenn wir das übergebene Objekt mit dem Schlüsselwort new und dem Klassenkonstruktor initialisieren, wird eine separate Kopie des Objekts im Speicher erstellt. Änderungen am Wert dieses Objekts ändern nicht das ursprüngliche Objekt, das als Parameter übergeben wurde. Das folgende Codebeispiel zeigt ein Szenario, in dem dieses Objekt als Wert an eine Funktion in C# übergeben wurde.

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      Console.WriteLine("Initial passed value = {0}", obj.s);
      obj = new Sample();
      obj.s = "something";
      Console.WriteLine("New value = {0}", obj.s);
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine("Original Value = {0}", sam.s);
    }
  }
}

Ausgabe:

Initial passed value = Nothing
New value = something
Original Value = Nothing

Wir haben das Objekt sam als Wert an die Funktion dosomething() in C# im obigen Code übergeben. Die Funktion dosomething() übernimmt das Argument, druckt seinen Anfangswert, ändert den Wert und druckt den geänderten Wert. Dieser neue Wert wird einem neuen Speicherort zugewiesen und kann vom ursprünglichen Objekt sam nicht aufgerufen werden.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Verwandter Artikel - Csharp Class