【问题标题】:C# reference type - string and object [duplicate]C# 引用类型 - 字符串和对象 [重复]
【发布时间】:2019-04-10 23:45:21
【问题描述】:

我正在研究 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。请解释如果对象是引用类型,为什么对象的值在函数中没有改变。

【问题讨论】:

  • 因为该函数不会更改testO 变量引用的对象上的任何内容。它将变量更改为指向新的引用。如果您做了类似testO.SomeProperty = "some value"; 的操作,那么引用对象上的该属性就会发生变化。
  • 我看不到你在哪里使用字符串。恕我直言,4 个重复项中有 3 个与问题不匹配。

标签: c#


【解决方案1】:

您从未将 AlterObject() 的参数声明为引用,因此它是按值传递的。 C# 将使用按值传递的方法,除非您使用 ref 关键字将给定参数指定为引用。您还需要重载(正如我在以下示例代码中所做的那样)或重写您的方法以接受参考值。

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

【讨论】:

    【解决方案2】:

    当您将值30 传递为object 时,您将创建一个新实例指向 30(这称为装箱),然后将其传递给方法。

    这个引用本身是通过 value 传递的 - 作为 .NET 中的 每个 参数。因此,您不能更改 reference,只能更改其字段或属性。您可以在方法中重新引用任何其他对象,但由于参数仍按值传递,因此不会反映在调用代码中。

    但即使使用ref-关键字a 也不会改变,因为它与装箱对象无关:

    static void AlterSObject(ref object testO)
    {
        int b = 130;
        testO = b;
    }
    

    现在o(这是装箱的对象,与a 无关)将反映您在AlterSObject 中分配给testO 的任何内容。但是a不会反映它。见my fiddle for test

    【讨论】:

    • 如果我创建 2 个对象,如下所示 - object o = 30;对象 o2 = o; o = 60;为什么 o 和 o2 不共享内存位置?
    • @AkshayP 因为您不修改底层对象(30),而只是引用另一个60)。所以o2 仍然指向完全相同的实例 (30)。
    猜你喜欢
    • 2016-05-28
    • 2019-11-16
    • 1970-01-01
    • 2015-02-13
    • 2021-03-24
    • 2014-02-12
    • 2010-11-08
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多