再次提出C#ref问题?

Pra*_*are 2 .net c#

 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

58225482
58225482
58225482
58225482
Run Code Online (Sandbox Code Playgroud)

FooFoo和之间有什么区别BarBar

ang*_*son 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();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,FooFoo更改也将更改方法中的f变量Main,但该BarBar方法仅更改局部变量.

在任何情况下,所有引用类型都作为引用类型传递,您无法更改它.唯一的一点ref是允许被调用的方法更改它传递的变量.