2009-08-18 18 views
6

Powiel możliwe:
What’s the difference between a parameter passed by reference vs. passed by value?co różni się od przechodzi wartości i przechodzącej przez odniesienie przy użyciu C#

mam trudności ze zrozumieniem różnicy pomiędzy wartością przechodzi i przechodzącej przez odniesienie. Czy ktoś może podać przykład C# ilustrujący różnicę?

+3

Duplikat http://stackoverflow.com/questions/373419/whats-the-difference-between-a-parameter-passed-by-resference-vs-passed-by-value –

+2

To jest * rodzaj * duplikatu, ale to w szczególności wymaga przykładów C# - podczas gdy w zadanym pytaniu nie ma żadnych przykładów C#. Na pewno dużo dobrej * ogólnej * dyskusji, ale nie wydaje mi się, że boli ją również specyficzne dla języka. –

+0

@ Jon Skeet: Czy nie jest właściwym rozwiązaniem, aby wstawić odpowiedź ze składnią C# do istniejącego pytania? Prawdopodobnie edytujesz istniejącą odpowiedź. – dmckee

Odpowiedz

16

Ogólnie przeczytaj my article about parameter passing.

Podstawowym założeniem jest:

Jeśli argument jest przekazywany przez odniesienie, a następnie zmienia się wartość parametru w sposób wpłynie na argument, jak również.

Subtelne jest to, że jeśli parametr jest typem odniesienia, a następnie robi:

someParameter.SomeProperty = "New Value"; 

nie jest zmieniając wartość parametru. Parametr jest tylko referencją, a powyższe nie zmienia tego, do czego odnosi się parametr, tylko dane w obiekcie. Oto przykład z autentycznie zmieniając wartość parametru:

someParameter = new ParameterType(); 

teraz na przykładach:

Prosty przykład: przechodzącą int przez ref lub wartości

class Test 
{ 
    static void Main() 
    { 
     int i = 10; 
     PassByRef(ref i); 
     // Now i is 20 
     PassByValue(i); 
     // i is *still* 20 
    } 

    static void PassByRef(ref int x) 
    { 
     x = 20; 
    } 

    static void PassByValue(int x) 
    { 
     x = 50; 
    } 
} 

bardziej skomplikowane przykład: użycie typów odniesienia

class Test 
{ 
    static void Main() 
    { 
     StringBuilder builder = new StringBuilder(); 
     PassByRef(ref builder); 
     // builder now refers to the StringBuilder 
     // constructed in PassByRef 

     PassByValueChangeContents(builder); 
     // builder still refers to the same StringBuilder 
     // but then contents has changed 

     PassByValueChangeParameter(builder); 
     // builder still refers to the same StringBuilder, 
     // not the new one created in PassByValueChangeParameter 
    } 

    static void PassByRef(ref StringBuilder x) 
    { 
     x = new StringBuilder("Created in PassByRef"); 
    } 

    static void PassByValueChangeContents(StringBuilder x) 
    { 
     x.Append(" ... and changed in PassByValueChangeContents"); 
    } 

    static void PassByValueChangeParameter(StringBuilder x) 
    { 
     // This new object won't be "seen" by the caller 
     x = new StringBuilder("Created in PassByValueChangeParameter"); 
    } 
} 
5

Przekazywanie według wartości oznacza przekazanie kopii argumentu. Zmiany w tej kopii nie zmieniają oryginału.

Przekazywanie przez odniesienie oznacza, że ​​przekazywane jest odniesienie do oryginału, a zmiany w odnośniku wpływają na oryginał.

To nie jest specyficzne dla języka C#, istnieje w wielu językach.

0

Trawienie jest:

Przechodząc przez odniesienie stosuje się, gdy można oczekiwać funkcja/metoda zmodyfikować zmienną.

Przekazywanie według wartości, gdy tego nie robisz.

Powiązane problemy