使用 "委托浮点数 "的统计浮点数加法。

问题描述 投票:0回答:1

我正在构建一个统计系统。在这个系统中,有某些统计是依靠其他统计来计算其最终值的。这是我最初的尝试。

public class ModdedStat
{
    public delegate float Mod();
    public Mod mod;
    public float baseStat;
    public float finalStat
    {
        get
        {
            return baseStat + mod();
        }
    }
}

不幸的是,这是返回baseStat +最后一个订阅model的监听器。我对此进行了如下测试。

stat.baseStat = 0;
stat.mod += Out1;
stat.mod += Out2;
Console.Write(stat.finalStat);

Out1和Out2是分别返回1和2的函数. 控制台写返回的是'2'。

我以前从来没有使用过返回类型的委托,所以不知道我的逻辑有什么问题。有没有类似的解决方案,甚至完全不同的变通方法?

谢谢你的帮助!我正在构建一个统计系统。

c# delegates
1个回答
2
投票

发生这种情况是因为默认情况下,调用多播会运行所有你使用添加的委托人的 +=,但返回的值将是你最后添加的那个值。毕竟,一次调用只能返回一个值。

如果你想要输出 3,您可以使用 GetInvocationList 来获取您使用 += 到多播委托。然后,你可以在数组中循环,将返回值加起来。

public float finalStat
{
    get
    {
        float totalMod = 0;
        foreach(Mod m in mod.GetInvocationList()) {
            totalMod += m();
        }
        return baseStat + totalMod;
    }
}

0
投票

除了使用 delegateGetInvocationList 在这种情况下,将是 Func:

var funcs = new List<Func<int>>();
funcs.Add(Out1);
funcs.Add(Out2);

funcs.Sum(f => f());

或者用你的课。

public class ModdedStat
{
    readonly List<Func<int>> funcs = new List<Func<int>>();

    public void AddFunc(Func<int>)
    {
        funcs.Add(func);
    }

    public float baseStat;
    public float finalStat => baseStat + funcs.Sum(f => f());
}

那么..:

stat.baseStat = 0;
stat.AddFunc(Out1);
stat.AddFunc(Out2);
Console.Write(stat.finalStat);
© www.soinside.com 2019 - 2024. All rights reserved.