将对象设置为 null,而不将其作为引用传递

本文关键字:引用 对象 设置 null | 更新日期: 2023-09-27 18:30:20

以下行为的 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"
    }
}

将对象设置为 null,而不将其作为引用传递

在 .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
    }
}

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

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

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

参考文献的文档可以在这里找到