2011-01-10 12 views
2

Ich denke, es ist ziemlich blöde Frage. Ich möchte ein Array-Argument nach Methode nach Wert übergeben, nicht nach Link, d. H. Ich möchte eine Kopie des Objekts erstellen, um zu verhindern, dass das Argument innerhalb der Methode geändert wird. Vielen Dank im Voraus.Übergeben Array zu Methode in C#

+1

Das Ändern des Arguments ist nie ein Problem, das sich nicht ausbreitet. Ändert nur den Array-Inhalt. –

Antwort

8

Wenn Ihre Methode destruktiv auf den Inhalt des Parameters reagiert, erstellen Sie einfach eine Kopie des Arrays innerhalb der Methode.

Dies ist so einfach wie

var copy = parameter.ToArray(); 

, wenn Sie LINQ verwenden, sonst kann es auch leicht mit Array.Copy erfolgen.

Dies ist viel besser als das Kopieren vor Aufruf der Methode (wie Sie in der Frage erwähnen), weil Sie immer vergessen können, das zu tun. Kopieren innerhalb die Methode lässt keine Fehlermöglichkeit.

+1

+1 für das Kopieren innerhalb der Methode vorgeschlagen. – juharr

1

Es gibt keine Möglichkeit, dies in C# zu tun. Sie müssen das Array entweder innerhalb der Methode oder auf der aufrufenden Seite selbst kopieren:

int[] array = GetIntArray(); 
CallSomeMethod(array.ToArray()); // ToArray() makes a copy of the input... 
3

Arrays sind Referenztypen. Sie können nicht automatisch geklont werden, wenn Sie an eine Methode übergeben werden.

Sie haben einen Klon von Hand zu machen, und die sich ergebende Anordnung an die Methode übergeben:

int[] array = ... 

MyMethod((int[])array.Clone()); 

Hinweis, dass dies ein O (n) Betrieb kann, kann sehr langsam sein für große Arrays oder viele wiederholte Anrufe.

1

Mein Verständnis der Frage in der OP ist das Plakat sucht nach einer Möglichkeit, einen Referenztyp nach Wert zu übergeben. Ich fand dieses Beispiel:

class PassingRefByVal 
{ 
    static void Change(int[] arr) 
    { 
     //arr[0]=888; // This change affects the original element. 
     arr = new int[5] {-3, -1, -2, -3, -4}; // This change is local. 
     Console.WriteLine("Inside the method, the first element is: {0}", arr[0]); 
    } 

    public static void Main() 
    { 
     int[] myArray = {1,4,5}; 
     Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", myArray [0]); 
     Change(myArray); 
     Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", myArray [0]); 
     Console.ReadLine(); 
    } 
} 

hier: http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx

Hoffnung das ist, was Sie suchen.

+0

Ist das nicht die Standardmethode zum Übergeben eines Array-Arguments? – comecme

Verwandte Themen