簡體   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