我正在研究C#中的引用和值类型。根据文档,字符串和对象是引用类型。当我们执行以下代码时:
static void Main(string[] args)
{
int a = 30;
object o = a;
AlterObject(o);
Console.WriteLine(o);
Console.Read();
}
static void AlterSObject(object testO)
{
int b = 130;
testO = b;
}
它将输出打印为30。请说明对象是否为引用类型,为什么在功能中不更改对象的值。
答案 0 :(得分:2)
当您将值30
传递为object
时,您将创建一个新实例,该实例指向到30(称为装箱),并将其传递给该方法。
此引用本身通过 value 传递-作为.NET中的每个参数。因此,您不能更改引用,而只能更改其字段或属性。您可以在方法中重新引用其他任何对象,但是由于参数仍按值传递,因此不会反映在调用代码中。
但是即使使用ref
关键字a
也不会改变,因为它与装箱的对象无关:
static void AlterSObject(ref object testO)
{
int b = 130;
testO = b;
}
现在o
(是装箱的对象,与a
无关)将反映您在testO
中分配给AlterSObject
的任何内容。但是a
将不反映出来。参见my fiddle for test。
答案 1 :(得分:0)
您从未将AlterObject()的参数声明为引用,因此它按值传递。除非您使用ref关键字将给定参数指定为参考,否则C#将使用按值传递方法。您还需要重载(如我在以下示例代码中所做的那样)或重写您的方法以接受参考值。
public class test{
static void Main(string[] args){
int a = 30;
object o = a;
AlterObject(ref o);
System.Console.WriteLine(o);
System.Console.Read();
}
static void AlterObject(object testO){
int b = 130;
testO = b;
}
static void AlterObject(ref object testO){
int b = 130;
testO = b;
}
}