C#引用类型-字符串和对象

时间:2018-11-07 14:17:59

标签: c#

我正在研究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。请说明对象是否为引用类型,为什么在功能中不更改对象的值。

2 个答案:

答案 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;
}
}