Die übergabe von arrays als parameter
Wenn wir ändern den Inhalt des Arrays als parameter übergeben innerhalb einer Methode die änderung erfolgt auf der Kopie des Arguments statt der original-argument daher ist das Ergebnis nicht sichtbar.
Was ist der Prozess, der passiert, wenn wir die call-Methode, die den Typ der Referenz argument?
Hier ist das code-Beispiel, was ich Fragen will
using System;
namespace Value_Refrence_Type
{
class Program
{
public static void Main()
{
int[] callingarray = { 22, 200, 25485 };
abc(callingarray);
Console.WriteLine("This is callingarray");
foreach (int element in callingarray)
Console.WriteLine(element);
}
//method parameter
static void abc(int[] calledarray)
{
Console.WriteLine("Method Called--------");
foreach (int element in calledarray)
Console.WriteLine(element);
//Here on changing the value of elements of calledarray does't afftect the value of element of callingarray
//if both refrences to same memory location then the value needs to change, which is not happening here
calledarray = new int[] {55, 54, 65};
foreach (int element in calledarray)
Console.WriteLine(element);
}
}
}
arrays oder anderen Objekten, sind nicht durch Verweis übergeben. Alle Objekte in C# - Wert übergeben werden standardmäßig. Übergeben durch Referenz, die Sie verwenden müssen, um die
nochmal, du verwechselst das Verhalten eines Referenz-Typ als Wert übergeben mit der übergabe eines Arguments als Referenz. Bei der übergabe per Referenz, die Sie zuweisen können, ein neues array, in das argument und es wird ändern Sie die variable an die callsite das ist eindeutig nicht der Fall in den code, die wir diskutieren. Wieder, es ist sehr einfach zu passieren, ein argument per Referenz müssen Sie verwenden Sie die bereitgestellten Schlüsselwörter
komisch, dass Sie auf meine eigene Antwort. Ich sehe, Sie sind nicht überzeugt, also werde ich nennen Sie MSDN hier: "(...) übergeben Sie einen parameter per Referenz, verwenden Sie die ref-oder out-Schlüsselwort. (...)".
Nein, ich sehe ein - parameter werden als Wert übergeben was bedeutet, dass die variable kopiert wird. Da die variable hat einen Typ der Referenz, die Referenz kopiert wird und es auf das gleiche Objekt zeigen. Aber das ist nicht die übergabe eines Parameters durch einen Verweis. Die übergabe eines Arguments als Referenz bringt mit der
Das ist nicht zu problematisch in Gesprächen unter Menschen, die tatsächlich verstehen, was passiert hinter den kulissen, aber für diejenigen, die nicht verstehen, was eigentlich vor sich geht, wie nicomp, es entsteht ein extrem Falsches mentales Modell von dem, was Los ist, das die Ergebnisse in das Programm nicht verhält, wie Sie erwarten, dass es, weil Sie denken, dass Sie vorbei sind Werte von Referenz, wenn Sie es nicht sind. Wenn die übergabe einer Referenz durch Wert und einen Wert per Referenz hat eigentlich die gleiche Semantik, dann Differenzierung zwischen Ihnen würde nicht wichtig sein, aber Sie nicht das gleiche Verhalten haben.
ref
oder out
Schlüsselwort. Sie scheinen verwirrend Referenz-Typen mit argument übergeben.nochmal, du verwechselst das Verhalten eines Referenz-Typ als Wert übergeben mit der übergabe eines Arguments als Referenz. Bei der übergabe per Referenz, die Sie zuweisen können, ein neues array, in das argument und es wird ändern Sie die variable an die callsite das ist eindeutig nicht der Fall in den code, die wir diskutieren. Wieder, es ist sehr einfach zu passieren, ein argument per Referenz müssen Sie verwenden Sie die bereitgestellten Schlüsselwörter
ref
oder out
, sonst wird es durch Wert übergeben werden. Ich schlage vor, Sie Lesen die entsprechenden Bereiche der C# - Spezifikationen bleiben Sie nicht überzeugt.komisch, dass Sie auf meine eigene Antwort. Ich sehe, Sie sind nicht überzeugt, also werde ich nennen Sie MSDN hier: "(...) übergeben Sie einen parameter per Referenz, verwenden Sie die ref-oder out-Schlüsselwort. (...)".
Nein, ich sehe ein - parameter werden als Wert übergeben was bedeutet, dass die variable kopiert wird. Da die variable hat einen Typ der Referenz, die Referenz kopiert wird und es auf das gleiche Objekt zeigen. Aber das ist nicht die übergabe eines Parameters durch einen Verweis. Die übergabe eines Arguments als Referenz bringt mit der
ref
Schlüsselwort und ermöglicht es Ihnen, änderung an der callsite der Wert der ursprünglichen Variablen, das heißt, dass ich sagen könnte, dass a = null
und zurück an die callsite die variable wäre null
bei der Methode zurückgegeben. Versuchen Sie, dass in Ihrem Beispiel und sehen, wie es funktioniert. Wieder, Lesen Sie einfach den link in meiner vorherigen Antwort.Das ist nicht zu problematisch in Gesprächen unter Menschen, die tatsächlich verstehen, was passiert hinter den kulissen, aber für diejenigen, die nicht verstehen, was eigentlich vor sich geht, wie nicomp, es entsteht ein extrem Falsches mentales Modell von dem, was Los ist, das die Ergebnisse in das Programm nicht verhält, wie Sie erwarten, dass es, weil Sie denken, dass Sie vorbei sind Werte von Referenz, wenn Sie es nicht sind. Wenn die übergabe einer Referenz durch Wert und einen Wert per Referenz hat eigentlich die gleiche Semantik, dann Differenzierung zwischen Ihnen würde nicht wichtig sein, aber Sie nicht das gleiche Verhalten haben.
InformationsquelleAutor mdadil2019 | 2016-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, das ist nicht korrekt.
Argumente als Wert übergeben werden, der standardmäßig in C#, das heißt, Sie erhalten eine Kopie der variable. Aber es ist wichtig zu erkennen, dass das, was kopiert wird ist nur die Variablen, nicht unbedingt das Objekt; wenn die variable enthält eine Referenz geben (ein array zum Beispiel) dann ist die variable wirklich nur ein "Zeiger" auf eine Speicher-Adresse, wo Sie das Objekt lebt. Also, wenn Sie übergeben, sagte variable an eine Methode aufrufen, wird die Referenz kopiert wird, ja, aber es müssen noch Punkte, um den exakt gleichen Objekt die ursprüngliche variable bezeichnet.
Dinge sind sehr unterschiedlich, wenn das argument ein Werttyp ist. In diesem Fall wird die variable selbst hält das Objekt, und deshalb würde sich das Verhalten, das Sie scheinen zu erwarten.
genau, weil Sie ändern kopieren der original-Referenz. Wenn Sie möchten, zu ändern, was die ursprüngliche variable gerichtet ist, dann müssen Sie übergeben das argument-by-reference.
Was dann die Linien im Bild(Buch) erklären möchte, ist es falsch?
Nein. Ändern Sie ein element des Arrays
a[1] = 1;
bestehen bleiben, weil das argument ist, auf das gleiche Objekt die ursprüngliche variable ist. Jedoch tun die folgendea = new[] { ...}
wird nicht bestehen, weil Sie die Zuweisung einer neuen Referenz auf eine Kopie der ursprünglichen Variablen. Die ursprüngliche variable oder der array-es zeigt keine Ahnung zu haben, und nicht darauf, dass Sie nur jeweils eine neue array zu kopieren, wurde die variable.InformationsquelleAutor InBetween
Hier sind viele Antworten mit einer Beschreibung. Ich versuche ein Beispiel zu geben. Lassen Sie uns sagen, das ist Ihre Methode:
Wenn Sie die Methode aufrufen wie diesem:
wird es wieder 999, weil
ProcessData
greift auf den Speicher des Arrays.Wie @Dazwischen beschrieben:
Das bedeutet, dass, wenn Sie die Daten in Ihrer Methode auf null:
wäre es nicht setzen Sie Ihre
dataToProcess
auf null. Das bedeutet:, Den Sie übergeben, die Kopie eines Zeigers auf den Speicher des Arrays an die Methode.
InformationsquelleAutor Fruchtzwerg
Arrays sind eine Referenz Typ in C#. Dies bedeutet, dass jedes mal, wenn ein array übergeben wird, als argument an eine Funktion, die Referenz (oder Zeiger) auf das argument an die Funktion übergeben wird. Damit alle änderungen, die Sie machen, um das array in der Funktion gemacht werden in der tatsächlichen argument auch.
Verhalten Sie sich beziehen, hier ist für Wert Typen und nicht-Referenz-Typen. Wertetypen in C# sind
struct
s undenum
s-und Referenz-Typen in C# sindclass
es und arrays.In c# Argumente übergeben: parameter Wert (default) Argumente übergeben durch Referenz, die wir haben, zu verwenden, ref-oder out-Schlüsselwort.
InformationsquelleAutor EvilTak
Arrays in c# übergeben werden können, die als Argumente an die Parameter der Methode. Da arrays Referenztypen sind, kann die Methode ändern Sie den Wert der Elemente.Für weitere Sie achten sollten, um diese msdn doc.
Because arrays are reference types, the method can change the value of the elements.
Arrays sind nicht änderbar denn Sie sind Referenz-Typen. Es ist veränderbar, und ein Referenz-Typ. Es gibt keine Kausalität gibt.Ich fand den link enthalten hilfreiche Beispiel. Danke.
InformationsquelleAutor Himanshu Dwivedi