给方法中的参数赋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
吗?
这是因为参数中的对象引用将在您的方法中保持不变(除非您显式地重新分配)。当您仅更改其属性时,不会对原始实例产生影响。方法完成后,调用方仍然可以访问原始对象并查看更改的属性。参数中的原始实例与调用方的传入引用保持相同。
当你用new或reassignment改变参数时,调用方永远不会意识到这个变化,除非你用out
或ref
改变方法签名。
如果您希望调用者知道在方法中重新分配或实例化的引用类型,则需要使用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
告诉调用者该方法可以修改也可以不修改原始引用。