C# 为什么NUnit';s Assert.That(..)有ref重载?
也许我只是在装傻,但你什么时候为什么要用:C# 为什么NUnit';s Assert.That(..)有ref重载?,c#,nunit,C#,Nunit,也许我只是在装傻,但你什么时候为什么要用: 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.Frame
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)
通过ref传递给这些方法带来了什么好处?深入研究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);
}
正如您所看到的,在实现上没有区别。Ref T actual
重载允许您将值类型作为引用传递,而引用类型已经作为引用传递
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());
}
}