2010-04-16 79 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()); 
    } 
} 

OUTPUT:C#再次提問?

58225482 
58225482 
58225482 
58225482 

是什麼FooFooBarBar之間的區別?

+0

而不是Foo類,嘗試使用字符串。 – Russell 2010-04-16 06:52:14

回答

6

在這種情況下沒有有效的區別。

ref的要點不是傳遞一個對象的引用,而是傳遞一個引用給變量。

考慮以下變化:

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(); 
} 

在這種情況下,FooFoo的變化也將改變在Main方法f變量,但BarBar方法僅改變一個局部變量。

在任何情況下,所有引用類型都作爲引用類型傳遞,您無法更改該引用類型。唯一指向ref的點是允許被調用的方法更改它正在傳遞的變量。