2011-02-11 56 views
8

也许我只是愚蠢的,但什么时候,为什么你会使用:为什么NUnit的Assert.That(..)有ref重载?

NUnit.Framework.Assert.That<T>(ref T, NUnit.Framework.Constraints.IResolveConstraint, string, params object[]) 
NUnit.Framework.Assert.That<T>(ref T, NUnit.Framework.Constraints.IResolveConstraint, string) 
NUnit.Framework.Assert.That<T>(ref T, NUnit.Framework.Constraints.IResolveConstraint) 

代替:

NUnit.Framework.Assert.That(object, NUnit.Framework.Constraints.IResolveConstraint, string, params object[]) 
NUnit.Framework.Assert.That(object, NUnit.Framework.Constraints.IResolveConstraint, string) 
NUnit.Framework.Assert.That(object, NUnit.Framework.Constraints.IResolveConstraint) 

也由参传递带来什么优势,这这些方法?

回答

5

挖掘到NUnit的源代码,我发现这一点:

static public void That<T>(ref T actual, IResolveConstraint expression, string message, params object[] args) 
{ 
    Constraint constraint = expression.Resolve(); 

    Assert.IncrementAssertCount(); 
    if (!constraint.Matches(ref actual)) 
    { 
     MessageWriter writer = new TextMessageWriter(message, args); 
     constraint.WriteMessageTo(writer); 
     throw new AssertionException(writer.ToString()); 
    } 
} 

    public virtual bool Matches<T>(ref T actual) 
    { 
     return Matches(actual); 
    } 

与:

static public void That(object actual, IResolveConstraint expression, string message, params object[] args) 
    { 
     Constraint constraint = expression.Resolve(); 

     Assert.IncrementAssertCount(); 
     if (!constraint.Matches(actual)) 
     { 
      MessageWriter writer = new TextMessageWriter(message, args); 
      constraint.WriteMessageTo(writer); 
      throw new AssertionException(writer.ToString()); 
     } 
    } 

正如你所看到的,有在实施无差异。 Ref T actual重载允许您将值类型作为参考传递,而引用类型已经作为参考传递。