2010-04-16 82 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的点是允许被调用的方法更改它正在传递的变量。