在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;
}
}
答案 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
关键字的方法时,对作为副本传递的对象的引用。您可以更改对象的值(属性),但如果将其设置为引用另一个对象,则不会影响原始引用。