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

时间:2010-10-21 19:10:52

标签: c#

我的直觉是说我不应该做以下事情。我没有收到任何关于它的警告。

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
 }

出于某种原因,我总是像第二个例子那样处理传递的参数。 但我不确定它是否真的很麻烦......也许这只是一种不合时宜的代码。

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

3 个答案:

答案 0 :(得分:16)

对参与者的值的更改对调用方是不可见的,除非它是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();
}

有关详情,请参阅我的article on parameter passing

答案 1 :(得分:4)

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

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

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

如果已发送ref - >参考可以改变。

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

答案 2 :(得分:0)

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

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

无论哪种方式,在这种情况下,你不会伤​​害任何其他人的价值(即使你重新分配了价值,也不会让它回到来电者身上)。