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");
}
}
Duplikat http://stackoverflow.com/questions/373419/whats-the-difference-between-a-parameter-passed-by-resference-vs-passed-by-value –
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. –
@ 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