我的直觉是说我不应该做以下事情。我没有收到任何关于它的警告。
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
}
出于某种原因,我总是像第二个例子那样处理传递的参数。 但我不确定它是否真的很麻烦......也许这只是一种不合时宜的代码。
我不认为调用方法会使用修改后的值。 任何人有任何意见
答案 0 :(得分:16)
对参与者的值的更改对调用方是不可见的,除非它是ref
或out
参数。
如果您通过参数更改引用类型对象引用,那么不的情况。例如:
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)
如果您希望能够访问原始值,请使用第二种方法。
如果您不关心原始值,可以使用其中任何一个(虽然我可能仍然使用第二个)。
无论哪种方式,在这种情况下,你不会伤害任何其他人的价值(即使你重新分配了价值,也不会让它回到来电者身上)。