2009-06-17 6 views

Répondre

7
private void functionName (ref Type variableName) 
{ 

} 

à l'appeler

functionName(ref variable); 
+0

et veillez à utiliser également le mot-clé ref lors de l'appel de la méthode SomeMethod (ref variableName); –

+0

bon point. Je vais l'ajouter – kemiller2002

3

Vous pouvez transmettre des paramètres par référence en C# en utilisant cette syntaxe.

public void MyMethod(ref string myString) 
{ 

} 

Vous devrez alors mettre ref avant la valeur lors du passage.

+1

Peut-être mérite-t-il de mentionner que cela [typiquement] n'est pas nécessaire pour passer des objets, seulement des primatifs. –

+0

Oui, très bon point. –

5

Votre question est extrêmement claire, mais il est tout à fait possible que mon article on parameter passing in C# répondra à tout ce que vous avez vraiment l'intention de demander.

En particulier, vous devez faire la distinction entre le passage d'une référence en valeur, et en passant un argument par référence. Si vous êtes flou sur les types de valeur et de référence, vous pouvez également regarder my article on that topic.

0

Indicatif téléphonique:

string companyName = "New Company"; 
GetEmail(ref companyName); 

Code de la méthode:

private void GetEmail(ref string companyName) 
{ 

} 
-1

Vos questions ne sont pas claires, mais je voudrais souligner que dans C#, sont passés des objets par référence par défaut . C'est-à-dire, si vous avez un objet, puis passez cet objet à une méthode qui apporte des modifications à cet objet, ces changements affecteront également l'objet dans votre code appelant, car ils référencent tous les deux le même objet.

+1

"en C#, les objets sont passés par référence par défaut": ce n'est pas vrai ... ils sont passés par valeur sauf si vous spécifiez le modificateur 'ref'. Je pense que vous confondez la différence entre les types de référence et les types de valeur, et la différence entre passer des paramètres par référence ou valeur. Lorsque vous transmettez un type de référence en tant que paramètre par valeur, vous transmettez une référence par valeur; la fonction appelée ne peut pas modifier cette référence, mais elle peut modifier l'objet référencé –

+0

Je trouve ça assez amusant quand les gens changent l'état d'un objet qui n'a pas été transmis par référence. Vraiment fait pour le code propre et évident. –

+0

@Thomas .. Vous ne faites que du nitpicking ... les types primitifs sont passés par valeur, les objets sont passés par référence. Oui, la référence à l'objet lui-même est transmise par valeur, mais l'objet lui-même n'est pas copié, mais une référence est envoyée. C'est pourquoi je dis que les objets sont transmis par référence. – BFree

2

Jon Skeet a un bon article sur ce here. En C#, les types de valeur (comme int, double, byte et structs) sont transmis par valeur, par défaut. Cela signifie que la méthode de réception a une nouvelle instance du type. Si un int qui a une valeur de 1 est passé à la méthode et que la méthode la change en 2, cette modification n'est reflétée que dans la méthode, l'int appelant est toujours 1. Si toutefois le mot-clé ref est ajouté, alors change apportées à cet entier sont renvoyées à l'emplacement appelant.

Toutes les classes en C# sont des types de référence. Cela signifie que, par défaut, les références sont transmises par valeur. C'est la partie importante. Cela signifie que les modifications apportées à cette instance de l'objet sont renvoyées à l'emplacement appelant, car il s'agit du même objet. Toutefois, si la méthode change de référence à un objet différent, cette modification n'est pas répercutée. Dans le cas où vous souhaitez que ces modifications soient répercutées, vous devez utiliser le mot-clé ref sur le paramètre.

public static void Main() 
    { 
     int i = 1; 
     Method1(i); //i here is still 1 
     Method2(ref i); //i is now 2 


     SimpleObj obj = new SimpleObj(); 
     obj.Value = 1; 

     Method3(obj); //obj.Value now 2 
     Method4(obj); // obj.Value still 2 
     Method5(ref obj); //obj.Value now 5 
    } 

    private static void Method5(ref SimpleObj obj) 
    { 
     obj = new SimpleObj(); 
     obj.Value = 5; 
    } 

    private static void Method4(SimpleObj obj) 
    { 
     obj = new SimpleObj(); 
     obj.Value = 5; 
    } 

    private static void Method3(SimpleObj obj) 
    { 
     obj.Value++; 
    } 

    private static void Method2(ref int i) 
    { 
     i++; 
    } 

    private static void Method1(int i) 
    { 
     i++; 
    } 

    public class SimpleObj 
    { 
     public int Value { get; set; } 
    } 

Le mot-clé est ref couvert dans la section 10.6.1.2 de la spécification C# 3.0. Here est la documentation msdn.

Questions connexes