繁体   English   中英

我可以修改传递的方法参数吗

[英]Can I modify a passed method parameter

我的直觉告诉我不应该做以下事情。 我没有收到任何警告。

void test(DateTime d)
{
 d = d.AddDays(2);
//do some thing with d
 }

或者这更合适

 void test(DateTime d)
 {
 DateTime _d = d.AddDays(1);
//do some thing with _d
 }

出于某种原因,我总是像在第二个示例中那样处理传递的参数。 但我不确定它是否真的是 nessesry ......也许它只是 unnessary 代码。

我不认为调用方法会使用修改后的值。 任何人有任何意见

参数值的更改对调用者是不可见的,除非它是refout参数。

这是不是这样的,如果你改变一个引用类型的对象由参数引用 例如:

public void Foo(StringBuilder b)
{
    // Changes the value of the parameter (b) - not seen by caller
    b = new StringBuilder();
}

public void Bar(StringBuilder b)
{
    // Changes the contents of the StringBuilder referred to by b's value -
    // this will be seen by the caller
    b.Append("Hello");
}

最后,如果通过引用传递参数,则可以看到更改:

public void Baz(ref StringBuilder b)
{
    // This change *will* be seen
    b = new StringBuilder();
}

有关更多信息,请参阅我关于参数传递的文章

您可以更改它,但更改不会返回给调用者。

如果是ValueType -> 发送对象的副本

如果是ReferenceType -> 对象引用的副本将按值发送。 通过这种方式,可以更改对象的属性,但不能更改引用本身 - 调用者无论如何都不会看到更改。

如果发送ref -> 可以更改引用。

在 C++ 中,您可以使用const来防止更改,但 C# 没有。 这只是为了防止程序员错误地尝试更改它 - 取决于使用const位置。

如果您希望能够访问原始值,请使用第二种方法。

如果你不关心原始值,你可以使用任何一个(不过我可能仍然使用第二个)。

无论哪种方式,在这种情况下,您都不会损害其他任何人的值(即使您重新分配该值,它也不会返回给调用者)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM