如果使用'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++中的对象有什么不同呢?
托尼
通过引用传递允许方法更改传递给方法的参数的值 - 因此对于引用类型,允许它更改变量的值以引用不同的对象.这是一个例子:
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
因为您没有更改参数本身的值 - 只有它引用的对象中的数据.
有关更多信息,请参阅有关参数传递的文章.