Wirklich, es gibt 3 Möglichkeiten, einen Parameter an eine Methode zu übergeben: durch Referenz, nach Wert und als Ausgabe.
von Wert der Standard ist und nicht über ein Schlüsselwort in C# (es tut in VB.Net: ByVal
) - es geht um eine Kopie von Werttypen:
public void SomeMethod1(int num)
{
num = 2;
}
int myNum = 1;
SomeMethod1(myNum );
// myNum is still 1, we just set a new one
Verwirrend - von Wert übergibt eine Kopie der Referenz für Referenztypen. Das bedeutet, dass die Änderungen an einen Referenztyp Punkt zurück auf die Instanz, aber Sie haben nur eine Kopie des aktuellen Zeiger auf die Referenz haben:
public void SomeMethod1(MyClass instance)
{
// changes the name on the instance
instance.Name = "test 1";
// we're only nulling the copy passed to this method
instance = null;
}
public void SomeMethod2(MyClass instance)
{
// changes the name on the instance
instance.Name = "test 2";
// this is a new instance only in this method
instance = new MyClass { Name = "new instance" };
}
MyClass myInst = new MyClass { Name = "original" };
SomeMethod1(myInst);
// myInst.Name is now "test 1"
SomeMethod2(myInst);
// myInst.Name is now "test 2"
Ok, jetzt durch Bezugnahme (ref
in C# oder ByRef
in VB.Net) übergibt einen Verweis auf den Wert für structs:
public void SomeMethod1(ref int num)
{
num = 2;
}
int myNum = 1;
SomeMethod1(ref myNum );
// myNum is now 2, we changed the reference
Einfach genug, aber für Referenztypen durch Bezugnahme übergibt den aktuellen Zeiger auf die Instanz, keine Kopie:
public void SomeMethod1(ref MyClass instance)
{
// changes the name on the instance
instance.Name = "test 1";
// we're nulling the reference passed to this method
instance = null;
}
public void SomeMethod2(ref MyClass instance)
{
// changes the name on the instance
instance.Name = "test 2";
// this is a new instance replacing the original
instance = new MyClass { Name = "new instance" };
}
MyClass myInst = new MyClass { Name = "original" };
SomeMethod1(ref myInst);
// myInst.Name will now throw a NullReferenceException because myInst is null
SomeMethod2(ref myInst);
// myInst.Name is now "new instance"
So, während beide durch Bezugnahme und von Wert für Referenztypen ähnlich sind, ist das Verhalten sehr deutlich, wenn Sie die Referenz ändern sich selbst (und nicht als das, was Sie sich beziehen).
Schließlich als Ausgabe ist eine zusätzliche Rückgabevariable, genau wie die tatsächliche Rückkehr. Diese beiden sind bascially gleich:
public int SomeMethod1()
{
return 1;
}
public void SomeMethod2(out int num)
{
num = 1;
}
Wenn Sie einen Out-Parameter es mit dem Verfahren aufgefüllt werden muss (wie bei einem Return).
Duplizieren Sie davon: http://StackOverflow.com/Questions/388464/c-whats-the-difference-between-the-ref-and-out-keywords/388467#388467 –