【问题标题】:Setting the object to null without passing it as ref将对象设置为 null 而不将其作为 ref 传递
【发布时间】:2012-04-06 10:44:30
【问题描述】:

以下行为的 C# 语言规范是什么。属性的值被保留,但新实例(null 或新对象)不会更新为实际参数。除了更改它指向的对象之外,它基本上起到 ref 的作用。

主函数中的对象保持不变(非空),但字符串属性已更改为“Hello World”

class Program
{
    class MyClass
    {
        public string str;
    }

    static void MyMethod(MyClass obj)
    {
        obj.str = "Hello World";
        obj = null;
    }

    static void Main(string[] args)
    {
        MyClass o = new MyClass();
        o.str = "Hello";
        Console.WriteLine(o.str);
        MyMethod(o);

        Console.WriteLine(o.str); // prints "Hello World"
    }
}

【问题讨论】:

  • 问题到底是什么?您的预期与实际发生了什么?
  • 上述内容是否实际打印“Hello World”(它不应该打印)还是应该这样做?
  • 我更新了问题,请看一下
  • @sarat 更新了我的答案
  • @sarat 下面的答案有帮助吗?

标签: c#


【解决方案1】:

在 .NET 语言中,对象引用是按值传递的。

那么这是什么意思?从概念上讲,您的代码与此相同,但指针明确:

static void MyMethod(MyClass *obj)
{
    obj->str = "Hello World";
    obj = NULL;
}

static void Main(string[] args)
{
    MyClass *o = new MyClass();
    o->str = "Hello";
    Console.WriteLine(o->str);
    MyMethod(o);

    Console.WriteLine(o->str); // prints "Hello World"
}

传递给MyMethod的参数是指针o的值,指向一个MyClass实例。可以取消引用指针来设置str的值,但是将实际指针值设置为null不会影响调用方法中的变量。

您可以通过以下方式通过引用传递引用:

以下行为的 C# 语言规范是什么。属性的值被保留,但新实例(null 或新对象)不会更新为实际参数。除了更改它指向的对象之外,它基本上起到 ref 的作用。

class Program
{
    class MyClass
    {
        public string str;
    }

    static void MyMethod(ref MyClass obj)
    {
        obj.str = "Hello World";
        obj = null;
    }

    static void Main(string[] args)
    {
        MyClass o = new MyClass();
        o.str = "Hello";
        Console.WriteLine(o.str);
        MyMethod(ref o);

        Console.WriteLine(o.str); // throws NullReferenceException, o is now null
    }
}

【讨论】:

    【解决方案2】:

    您通过引用传递对象值。这允许您更改对象中属性的值,并且更改将在调用方法中看到。但是,变量obj 所指的内容的更改不会在调用方法中看到。

    如果您希望在整个过程中更改变量引用,则需要通过引用传递引用。为此,您应该将方法声明更改为:

    static void MyMethod(ref MyClass obj){...}
    

    参考文档可以在here找到

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2021-10-07
      • 2021-10-30
      • 1970-01-01
      • 2015-11-22
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      相关资源
      最近更新 更多