C#中的Reference类型和ref有什么区别?

时间:2017-01-07 13:35:54

标签: c# ref

ref类型和Reference type中,我能够更改对象的值,以便它们之间有什么区别?

有人提供了answer,但对我来说仍然不清楚。

static void Main(string[] args)
{
    myclass o1 = new myclass(4,5);
    Console.WriteLine("value of i={0} and j={1}", o1.i, o1.j); //o/p=4,5

    o1.exaple(ref o1.i, ref o1.j);    //Ref type calling
    Console.WriteLine("value of i={0} and j={1}", o1.i, o1.j);// o/p=2,3
    myclass o2 = o1;
    Console.WriteLine("value of i={0} and j={1}", o2.i, o2.j);  // o/p 2,3
    o1.i = 100;
    o1.j = 200;
    Console.WriteLine("value of i={0} and j={1}", o1.i, o1.j);  //o/p=100,200
    Console.WriteLine("value of i={0} and j={1}", o2.i, o2.j); //o/p=100,200
    Console.ReadKey();
}

public class myclass
{
    public int i;
    public int j;

    public myclass(int x,int y)
    {
        i = x;
        j = y;
    }
    public void exaple(ref int a,ref int b) //ref type
    {
        a = 2;
        b = 3;
    }
}

1 个答案:

答案 0 :(得分:5)

带有ref关键字的参数提供对象引用的引用,您可以在此处更改此引用在更改后指向的位置

public void TestObject(Person person)
{ 
    person = new Person { Name = "Two" };
}

public void TestObjectByRef(ref Person person)
{ 
    person = new Person { Name = "Two" };
}

然后当你使用这些方法时

var person = new Person { name = "One" };

TestObject(person);
Console.WriteLine(person.Name); // will print One

TestObjectByRef(ref person);
Console.WriteLine(person.Name); // will print Two

以下来自MSDN的评论:https://msdn.microsoft.com/en-us/library/14akc2c7.aspx

  

ref关键字导致参数通过引用传递,而不是通过引用传递   值。通过引用传递的效果是任何改变   被调用方法中的参数反映在调用方法中。对于   例如,如果调用者传递局部变量表达式或数组   元素访问表达式,被调用的方法替换该对象   ref参数引用的,然后是调用者的局部变量或   数组元素现在引用新对象。

将引用类型作为参数传递给没有ref关键字的方法时,对作为副本传递的对象的引用。您可以更改对象的值(属性),但如果将其设置为引用另一个对象,则不会影响原始引用。