Vraiment il y en a 3 façons de passer un paramètre à une méthode: par référence, par valeur et comme sortie.
Par valeur est la valeur par défaut et ne dispose pas d'un mot-clé en C# (il fait en VB.Net: ByVal
) - il passe une copie de types de valeurs:
public void SomeMethod1(int num)
{
num = 2;
}
int myNum = 1;
SomeMethod1(myNum );
// myNum is still 1, we just set a new one
Embrouillant - Par valeur passe une copie de la référence pour les types de référence. Cela signifie que les modifications apportées à un point de type de référence à l'instance, mais vous avez seulement une copie du pointeur réelle à la référence:
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, maintenant par référence (ref
en C# ou ByRef
en VB.Net) passe une référence à la valeur de struct:
public void SomeMethod1(ref int num)
{
num = 2;
}
int myNum = 1;
SomeMethod1(ref myNum );
// myNum is now 2, we changed the reference
assez simple, mais pour les types de référence par référence passe le pointeur à l'instance réelle, pas une copie:
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"
Ainsi, alors que les deux par référence et par valeur sont similaires pour les types de référence, le comportement est très différent si vous changez la référence elle-même (plutôt que ce que vous faites référence).
Enfin comme sortie est une variable de retour supplémentaire, tout comme le rendement réel. Ces deux sont les mêmes bascially:
public int SomeMethod1()
{
return 1;
}
public void SomeMethod2(out int num)
{
num = 1;
}
Si vous avez un paramètre, elle doit être rempli par la méthode (comme un retour).
Dupliquer de ceci: http://stackoverflow.com/questions/388464/c-whats-the-difference-between-the-ref-and-out-keywords/388467#388467 –