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

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

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 } 

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

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

参数值的更改对调用者是不可见的,除非它是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 – >发送对象的副本

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

如果发送ref – >参考可以更改。

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

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

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

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