Ref的C#对象

Ton*_*ion 0 c# reference

如果使用'Ref'关键字将对象传递给方法,那么在没有ref关键字的情况下传递它的区别是什么?

因为两者都产生相同的结果,所以在将控制权传递回调用对象时对象已被更改.

比如这样:

 class Student
{
    public string Name
    {
        get;
        set;
    }

    public int Age
    {
        get;
        set;
    }
}
class Program
{
    static Student student = new Student();
    static void Main( string[] args )
    {

        student.Age = 30;
        student.Name = "StudentA";

        Console.WriteLine("Original Student: {0}, Age: {1}", student.Name, student.Age);

        SetStudent(ref student);

        Console.WriteLine("Student by Ref {0}, Age{1}", student.Name, student.Age);

        AnotherStudent(student);

        Console.WriteLine("Just Another Student {0}, Age {1}", student.Name, student.Age);
        Console.ReadLine();
    }

    public static void SetStudent( ref Student student )
    {
        student.Age = 16;
        student.Name = "StudentY";
    }

    public static void AnotherStudent( Student studenta )
    {
        if (studenta.Equals(student))
        {
            Console.WriteLine("The same object in memory");
        }
        studenta.Age = 12;
        studenta.Name = "StudentX";
    }
}
Run Code Online (Sandbox Code Playgroud)

当学生对象传递给AnotherStudent()时,它会被改变,事件认为它没有被'Ref'传递.

有人能解释一下这里发生了什么吗?

编辑

那么在函数中将指针传递给C++中的对象有什么不同呢?

托尼

Jon*_*eet 6

通过引用传递允许方法更改传递给方法的参数的值 - 因此对于引用类型,允许它更改变量的值以引用不同的对象.这是一个例子:

using System;
using System.Text;

class Test    
{    
    static void PassByValue(StringBuilder x)
    {
        x.Append(" - Modified object in method");
        x = new StringBuilder("New StringBuilder object");
    }

    static void PassByReference(ref StringBuilder x)
    {
        x.Append(" - Modified object in method");
        x = new StringBuilder("New StringBuilder object");
    }

    static void Main()
    {
        StringBuilder builder = new StringBuilder("Original");
        PassByValue(builder);
        Console.WriteLine(builder);

        builder = new StringBuilder("Original");
        PassByReference(ref builder);
        Console.WriteLine(builder);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,原始StringBuilder内容都已修改其内容,然后为参数分配一个新值.在"按值传递"的情况下,这不会改变builder变量的值Main.在"按引用传递"的情况下,值是builder指新的StringBuilder,所以结果是:

Original - Modified object in method
New StringBuilder object
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您没有看到有或没有任何差异,ref因为您没有更改参数本身的值 - 只有它引用的对象中的数据.

有关更多信息,请参阅有关参数传递的文章.