5 Stimmen

C# verwirrende Methode

Ich habe gekämpft, um zu verstehen, was mit einer Methode vor sich geht, die ich für meinen Test verstehen muss, ich habe eine harte Zeit, den Grund herauszufinden, warum ich die Ergebnisse erhalte, die ich erhalte, jede Erklärung darüber, wie die "f"-Methode funktioniert, wird sehr geschätzt

class Program {
  static void Main(string[] args)
  {
    A b = new A(); b.y = b.x;
    b.f(b.y); b.g();
    Console.WriteLine(b.x[0] + " " + b.x[1]); // Prints 1 7
    Console.WriteLine(b.y[0] + " " + (b.x[1] + b.y[1])); // 1 14
  }
}

public class A {
  public int[] x = {1, 2};
  public int[] y;
  public void f(int[] z)
  {
      z[1] += 5;
  }

  public void g()
  {
      A a = new A ();
      a.x[0]++;
      a.x[1]--;
  }
}

Lassen Sie mich erklären, was ich verstanden habe, b.y wird als ein Array erstellt und es erhält die Werte in b.x, jetzt, wenn wir b.f aufrufen, übergeben wir diese Methode b.y, die [1, 2] ist, jetzt, und hier ist, wo ich stecken bleiben, z scheint die b zu sein. y Array zu sein, also hat es [1, 2] als Wert, wenn die Methode 5 zu dem Element an der Position 1 (was 2 ist) addiert, erhalte ich [1, 7] als Ergebnis davon, wenn die Methode endet und mein Programm zurück zum Main geht, sind irgendwie b.y UND b.x BEIDE jetzt [1, 7], wie ist das passiert? Ich dachte, die Methode würde nur b.y ändern, da es das ist, was übergeben wurde. Außerdem fügt die g-Funktion nichts hinzu, da der "a"-Wert eine lokale Variable ist, die "stirbt", wenn die Methode endet, richtig? Ich hoffe, jemand kann mir helfen, ich muss diesen Test bestehen!. Danke ;]

2voto

Simon Whitehead Punkte 60375

Jetzt geht's los:

  • Eine neue Variable namens b wird mit einem Typ von A .
  • Wenn b erstellt wird, setzt es den Wert von b.x a {1, 2} .
  • b.y wird dann zugewiesen an b.x Da es sich jedoch um Arrays handelt, verweisen sie nun auf dieselben Daten.
  • b.f aufgerufen wird, und hat b.y übergeben (wobei zu beachten ist, dass b.y y b.x beziehen sich gerade auf dieselben Daten). Im Wesentlichen zeigt z auch auf die gleichen Daten während der f Funktion.
  • b.f addiert 5 zu dem Wert an Index 1 der gemeinsamen Daten, der 2 ist. 2 + 5 = 7.
  • Erste Console.WriteLine druckt b.x[0] was immer noch 1 ist. Dann druckt es b.x[1] die jetzt 7 ist (wie oben).
  • Zweite Console.WriteLine druckt b.y[0] was immer noch 1 ist (weil sie dieselben Daten haben). Dann druckt er b.x[1] + b.y[1] . Sie haben beide die gleichen Daten und die Daten bei Index 1 sind 7. 7 + 7 = 14.

Sie haben Recht, was die g Methode, da die Variable lokal ist und nichts bewirkt.

Ich hoffe, das hilft.

1voto

horgh Punkte 17039
b.y = b.x;

Diese Codezeile kopiert lediglich einen Verweis, der in x Variable zu y variabel. Beide Variablen verweisen also auf ein und dasselbe Array. Sie haben also nur ein Array und zwei Variablen, die darauf verweisen.

public void g(){...}

Diese Methode erstellt ein neues Element, macht etwas damit, speichert es aber nirgends, so dass es nach der Rückkehr der Methode verloren ist (es gibt keine Verweise darauf, es ist bereit, in den Müll zu wandern).

enter image description here

Versuchen Sie zu lesen Wert vs. Referenz

1voto

naasking Punkte 2408

Sie sind nur verwirrt über das, was man in Programmiersprachen als "Identität" bezeichnet. Vereinfacht gesagt, gibt es in Programmiersprachen zwei Kategorien von Werten: reine Werte und Werte mit Identität.

Reine Werte können verschiedene Dinge bedeuten, aber im Grunde entsprechen sie dem erwarteten Verhalten, d.h. jedes Unterprogramm erhält seine eigene "Kopie" eines Arrays X, das von allen anderen Unterprogrammen mit X isoliert ist.

Werte mit Identität halten sich nicht an das oben beschriebene Kopierverhalten. Eine Instanz X ist gemeinsam genutzt zwischen allen Unterprogrammen, an die X übergeben wird. Das bedeutet, dass alle Unterprogramme die von allen anderen Unterprogrammen vorgenommenen Änderungen sehen.

Im Allgemeinen werden in der .NET/C#-Dokumentation Werte mit Identität als Referenztypen bezeichnet. Die Wertetypen von .NET sind eine Art "reiner Wert", der eine Kopiersemantik hat. Aber Werttypen können Werte mit Identität enthalten, und Referenztypen können absichtlich an der Reinheit festhalten, also ist es nicht unbedingt so einfach.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X