![](/img/trans.png)
[英]How can i get the parameter values of an anonymous method passed as a func?
[英]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 代码。
我不认为调用方法会使用修改后的值。 任何人有任何意见
对参数值的更改对调用者是不可见的,除非它是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();
}
有关更多信息,请参阅我关于参数传递的文章。
您可以更改它,但更改不会返回给调用者。
如果是ValueType -> 发送对象的副本
如果是ReferenceType -> 对象引用的副本将按值发送。 通过这种方式,可以更改对象的属性,但不能更改引用本身 - 调用者无论如何都不会看到更改。
如果发送ref
-> 可以更改引用。
在 C++ 中,您可以使用const
来防止更改,但 C# 没有。 这只是为了防止程序员错误地尝试更改它 - 取决于使用const
位置。
如果您希望能够访问原始值,请使用第二种方法。
如果你不关心原始值,你可以使用任何一个(不过我可能仍然使用第二个)。
无论哪种方式,在这种情况下,您都不会损害其他任何人的值(即使您重新分配该值,它也不会返回给调用者)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.