给方法中的参数赋NULL值

本文关键字:NULL 参数 方法 | 更新日期: 2023-09-27 18:16:30

我知道传递给方法的引用类型是可以修改的。但是我发现它只对参数的成员起作用,而不是参数本身。下面是一个测试:

这是一个引用类型:

class MyClass
{
    public int PropInt { get; set; }
    public string PropStr { get; set; }
    public int FieldInt;
    public string FiledStr;
}

这个方法修改它的成员:

void MyFun(MyClass myClass)
    {
        myClass.PropInt = 3;
        myClass.FieldInt = 4;
        myClass.PropStr = "c";
        myClass.FiledStr = "d";
    }

修改自己(null或new):

void MyFunNull(MyClass myClass)
    {
        myClass = new MyClass();
        //myClass = null;
    }

初始化:

MyClass myClass = new MyClass
        {
            PropInt = 1,
            FieldInt = 2,
            PropStr = "a",
            FiledStr = "b"
        };
测试:

---> output {1, 2, "a", "b"}
MyFun(myClass); ---> output {3, 4, "c", "d"}
MyFunNull(myClass); ---> output {3, 4, "c", "d"}

这是怎么回事?在这种情况下,我必须使用out/ref吗?

给方法中的参数赋NULL值

这是因为参数中的对象引用将在您的方法中保持不变(除非您显式地重新分配)。当您仅更改其属性时,不会对原始实例产生影响。方法完成后,调用方仍然可以访问原始对象并查看更改的属性。参数中的原始实例与调用方的传入引用保持相同。

当你用new或reassignment改变参数时,调用方永远不会意识到这个变化,除非你用outref改变方法签名。

如果您希望调用者知道在方法中重新分配或实例化的引用类型,则需要使用ref关键字修改它(参见msdn)

例如:

public void Foo(ref MyClass bar)
{
   // Caller will get this new instance back
   // after method completes.
   bar = new MyClass()
}

更改引用:下面的示例将参数更改为某个预先存在的本地引用。

private MyClass myLocalBar
public void Foo(ref MyClass bar)
{
   // Caller will get the modified reference
   bar = this.myLocalBar;
}

您也可以使用out (msdn)关键字做类似的事情。但与ref不同的是,out将要求您为out参数赋值。在对out参数赋值之前尝试完成该方法将产生编译错误。

public void Foo(out MyClass bar)
{
   // We must assign a value to bar
   bar = new MyClass()
}

下面将产生错误(取消注释最后一行来修复)

public void Foo(out MyClass bar)
{
   // We must assign a value to bar
   // Even null assignment is ok:
   // bar = null;
}

out参数总是保证调用者将返回一个新的/不同的引用。然而,ref告诉调用者该方法可以修改也可以不修改原始引用。