2010-08-04 36 views
3

我的單元測試中有這個奇怪的問題。請看下面的代碼引用類型未作爲參考傳遞

_pos = null; 
Utilities.InitPOS(_pos, trans); 
Assert.IsNotNull(_pos); //fails 

InitPOS功能看起來像

public static void InitPOS(POSImplementation pos, Transaction newTransaction) 
{ 
    pos = new POSImplementation(); 
    pos.SomeProp = new SomeProp(); 
    pos.SomeProp.SetTransaction(newTransaction); 
    Assert.IsNotNull(pos); 
    Assert.IsNotNull(pos.SomeProp); 
} 

對象POSImplementation是一些接口的實現,它是一個類,所以它是一個引用類型...

有什麼想法?

回答

8

您正在將對象的引用傳遞給InitPOS(即null引用),而不是對名爲_pos的變量的引用。結果是新的POSImplementation實例被分配給InitPOS方法中的本地變量pos,但_pos變量保持不變。

更改您的代碼以

_pos = Utilities.InitPOS(trans); 
Assert.IsNotNull(_pos); 

其中

public static POSImplementation InitPOS(Transaction newTransaction) 
{ 
    POSImplementation pos = new POSImplementation(); 
    // ... 
    return pos; 
} 
+0

+1:請參閱Jon Skeet撰寫的「C#傳遞的參數」,以獲得完整的解釋。 http://www.yoda.arachsys.com/csharp/parameters.html – 2010-08-04 12:01:46

+0

是的,我知道這是一個解決方案,但我沒有得到什麼問題。現在我知道了,謝謝! – Henri 2010-08-04 12:11:05

1
pos = new POSImplementation(); 

只要你在那裏做什麼,如果有人將pos已經進入方法已經?您是否缺少該參數上的ref屬性?

+1

+1 Ref確實解決了這個問題。我也知道我做錯了什麼 – Henri 2010-08-04 12:09:53

1

參照通過實例, 按值通過參考。