2010-08-04 64 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

参照通过实例, 按值通过参考。