C# 这是一个很好的组合套利策略吗?

C# 这是一个很好的组合套利策略吗?,c#,fscheck,C#,Fscheck,刚开始研究FsCheck,编写了几个测试,现在我想知道,对于编写更复杂的任意性,什么是一个好的策略。在任意的范围内登记任意性是一个好方法吗?像这样的 public class DiscountAmountArbitrator { public static Arbitrary<DiscountAmount> DiscountAmounts() { Arb.Register<AmountArbitrary>()

刚开始研究FsCheck,编写了几个测试,现在我想知道,对于编写更复杂的任意性,什么是一个好的策略。在任意的范围内登记任意性是一个好方法吗?像这样的

public class DiscountAmountArbitrator
    {
        public static Arbitrary<DiscountAmount> DiscountAmounts()
        {
            Arb.Register<AmountArbitrary>();

            var toReturn = (from a in Arb.Generate<Amount>()
                            select new DiscountAmount(a))
                          .ToArbitrary();

            return toReturn;
        }
    }

 public class AmountArbitrary
    {
        public static Arbitrary<Amount> Amounts()
        {
            return Arb.Generate<decimal>().Where(x => x > 0)
                .Select(x => new Amount(x))
                .ToArbitrary();
        }
    } 
公共类折扣
{
公共静态任意折扣()
{
Arb.Register();
var toReturn=(来自Arb.Generate()中的a)
选择新折扣(a))
.ToArbitrary();
回归回归;
}
}
公共类任意变量
{
公共静态任意金额()
{
返回Arb.Generate(),其中(x=>x>0)
.选择(x=>新金额(x))
.ToArbitrary();
}
} 

我的建议是,如果您有不同的相关任意实例,请将它们添加到同一个类中,并在不同实例之间存在依赖关系时直接调用这些方法。然后,当在测试中使用任意实例时,立即注册它们

这使得代码不太依赖于执行的顺序(Arb.Register是一个基本的副作用操作,这可能会导致一些意外的结果)。将任意方法放在不同的类上没有真正的优势。因此,我将重写您的内容,如下所示:

public class Arbitraries
{
    public static Arbitrary<DiscountAmount> DiscountAmounts()
    {
        var toReturn = (from a in Amounts().Generator
                        select new DiscountAmount(a))
                      .ToArbitrary();

        return toReturn;
    }

    public static Arbitrary<Amount> Amounts()
    {
        return Arb.Generate<decimal>().Where(x => x > 0)
            .Select(x => new Amount(x))
            .ToArbitrary();
    }
} 
公共类仲裁
{
公共静态任意折扣()
{
var toReturn=(来自一个in Amounts()生成器
选择新折扣(a))
.ToArbitrary();
回归回归;
}
公共静态任意金额()
{
返回Arb.Generate(),其中(x=>x>0)
.选择(x=>新金额(x))
.ToArbitrary();
}
} 

由于您使用的是
shrink
的默认实现,您最好只定义生成器并将其传递到
DiscountAmounts
。然后分别注册
任意
实例。