gpt4 book ai didi

c# - 为什么 NUnit 的 Assert.That(..) 有 ref 重载?

转载 作者:太空狗 更新时间:2023-10-29 19:41:51 24 4
gpt4 key购买 nike

也许我只是很愚蠢,但你什么时候以及为什么会使用:

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)

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);
}

对比:

    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 重载还允许您将值类型作为引用传递,而引用类型已作为引用传递。

关于c# - 为什么 NUnit 的 Assert.That(..) 有 ref 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4967726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com