2013-02-11 48 views
-5

比方說,我有一個調用一些參數的另一種方法一種方法,是這樣的:通過引用傳遞,而不是返回一個值

public void SomeMethod() 
    { 
     List<SomeObject> TheList = SomeQueryThatReturnsTheList(); 

     TheList = DoSomeWorkWithList(TheList); 
    } 

    public List<SomeObject> WorkForList(List<SomeObject> TheListAsParameter) 
    { 
     foreach (SomeObject x in TheListAsParameter) 
     { 
      .... 
     } 

     return TheListAsParameter; 
    } 

正如你所看到的,WorkForList返回收到的列表的方法。我的問題是這樣的:如果我不返回列表並重寫簽名爲public void WorkForList(List<SomeObject> TheListAsParameter)通過引用在C#去意味着SomeMethod中的列表將更新與WorkForList方法完成的工作?如果是這樣,下面的代碼將工作相同:

public void SomeMethod() 
    { 
     List<SomeObject> TheList = SomeQueryThatReturnsTheList(); 

     DoSomeWorkWithList(TheList); 
    } 

    public void WorkForList(List<SomeObject> TheListAsParameter) 
    { 
     .... 
    } 

謝謝。

+6

你爲什麼不簡單地測試它? – poitroae 2013-02-11 12:54:02

+0

我不認爲這個問題值得這麼多downvotes,它是一個有效的問題,我看到很多開發人員對c#參數傳遞的概念感到困惑# – Habib 2013-02-11 13:02:43

+1

@Habib它顯示缺乏有關通過引用與傳遞的基礎研究值。這些概念不是特定於C#的,並且已經多次記錄。 – Romoku 2013-02-11 13:04:37

回答

4

那麼,如果你不使用ref關鍵字,其地址將被按值傳遞,這意味着你將能夠改變它的元素,但你不能初始化,或不能將其指定爲null。例如。如果你的方法,你這樣做:

public void WorkForList(List<SomeObject> TheListAsParameter) 
{ 
    TheListAsParameter = null; 
} 

你不會看到來電者的差異。

你應該看到的這篇文章:Parameter passing in C# by Jon Skeet

+0

你可以檢查與lngo的回答?似乎它有衝突。 – frenchie 2013-02-11 13:33:16

+0

@frenchie,Ingo的回答對於'foreach'循環是正確的,但與參數傳遞無關 – Habib 2013-02-12 06:24:33

1

是的,你可以做到這一點。但爲了清晰起見,返回對象可能很有用,並允許方法鏈接。

例如與第一WorkForList方法:

yourObject.WorkForList(list).DoSomethingWithTheReturnedList(); 
1

是 - 這應該表現得完全如你所描述......當然,你可以測試你已經寫的代碼?

1

是的,只要你WorkForList()方法不具有這樣一行:

TheListAsParameter = something; 

那麼您對TheListAsParameter任何更改將反映在調用方法沒有返回它。

說的確切,在這種情況下,您沒有通過引用傳遞變量。您正在按值傳遞引用類型。通過引用傳遞涉及在C#中使用ref關鍵字。

2

在這種情況下,代碼會做你想做的事,但記住兩件事是什麼:

  • C#是「按值傳遞」的語言。它傳遞對象的地址,所以這隻有在你使用這個實例時纔有效,而不是改變實例本身。爲此,您應該使用ref關鍵字,但通常最終難以閱讀代碼。
  • 返回對象極大地提高了可讀性 - 你所做的被認爲是一種副作用,你的方法的用戶(可能是另一個團隊成員)可能不知道你正在修改列表內容。
1

只要你不使用的foreach修改列表的值:

foreach (SomeObject x in TheListAsParameter) 
    { 
     .... 
    } 

正如你不允許通過使用的foreach修改收集你走路的內容。

+0

實際上,該方法是否使用了foreach循環,你能澄清一下嗎? – frenchie 2013-02-11 13:10:22

+0

c#不允許你修改x,在這種情況下給你一些錯誤信息,比如'不能分配給x ...因爲它是'foreach迭代變量',這意味着c#中的foreach循環專門用於迭代集合來讀取信息,您將無法將數據寫入迭代變量 – Ingo 2013-02-11 13:30:00

+0

您可以使用Habib的答案進行檢查嗎?似乎它有衝突。 – frenchie 2013-02-11 13:33:41

相關問題