2010-04-16 6 views
2
class Foo 
    { 
     public int A { get; set; } 
    } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var f = new Foo(); 
     var ff = f; 

     Console.WriteLine(f.GetHashCode()); 
     Console.WriteLine(ff.GetHashCode()); 

     FooFoo(ref f); 
     BarBar(f); 
    } 

    private static void BarBar(Foo f) 
    { 
     Console.WriteLine(f.GetHashCode()); 
    } 

    private static void FooFoo(ref Foo f) 
    { 
     Console.WriteLine(f.GetHashCode()); 
    } 
} 

SORTIE:C# ref question encore?

58225482 
58225482 
58225482 
58225482 

Quelle est la différence entre FooFoo et BarBar?

+0

Au lieu de la classe Foo, essayez de le faire avec une chaîne. – Russell

Répondre

6

Aucune différence effective dans ce cas.

Le point de ref n'est pas de passer une référence à un objet, c'est de passer une référence à une variable.

Tenir compte de la modification suivante:

private static void BarBar(Foo f) 
{ 
    Console.WriteLine(f.GetHashCode()); 
    f = new Foo(); 
} 

private static void FooFoo(ref Foo f) 
{ 
    Console.WriteLine(f.GetHashCode()); 
    f = new Foo(); 
} 

Dans ce cas, le changement du FooFoo modifiera également la variable f dans la méthode Main, mais la méthode BarBar est changeant seulement une variable locale.

Tous les types de référence sont passés en tant que types de référence dans tous les cas, vous ne pouvez pas changer cela. Le seul point à ref est de permettre à la méthode appelée de changer la variable en cours de transmission.