使用 'delegate float' 统计浮点数加法
Statistic float addition using 'delegate float'
我正在构建一个统计系统。在系统中,某些统计数据依赖于其他统计数据来计算其最终值。这是我最初的尝试:
public class ModdedStat
{
public delegate float Mod();
public Mod mod;
public float baseStat;
public float finalStat
{
get
{
return baseStat + mod();
}
}
}
不幸的是,这是 return baseStat + 最后一个订阅 mod 的侦听器。我测试如下:
stat.baseStat = 0;
stat.mod += Out1;
stat.mod += Out2;
Console.Write(stat.finalStat);
Out1和Out2分别是return1和2的函数。控制台写入 returned '2'。
我以前从未使用过 return 类型的委托,所以我不确定我的逻辑有什么问题。是否有类似的解决方案,甚至是完全不同的解决方法?
感谢您的帮助!
发生这种情况是因为默认情况下,调用多播将 运行 您使用 +=
添加的所有委托,但 return 值 returned 将是一个从你添加的最后一个。毕竟一次调用只能return一个值
如果您想要输出 3
,您可以使用 GetInvocationList
获取您使用 +=
添加到多播委托的委托。然后,您可以遍历数组并向上添加 return 值。
public float finalStat
{
get
{
float totalMod = 0;
foreach(Mod m in mod.GetInvocationList()) {
totalMod += m();
}
return baseStat + totalMod;
}
}
在这种情况下使用 delegate
和 GetInvocationList
的替代方法是 Func
:
var funcs = new List<Func<int>>();
funcs.Add(Out1);
funcs.Add(Out2);
funcs.Sum(f => f());
或使用您的 class:
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);
我正在构建一个统计系统。在系统中,某些统计数据依赖于其他统计数据来计算其最终值。这是我最初的尝试:
public class ModdedStat
{
public delegate float Mod();
public Mod mod;
public float baseStat;
public float finalStat
{
get
{
return baseStat + mod();
}
}
}
不幸的是,这是 return baseStat + 最后一个订阅 mod 的侦听器。我测试如下:
stat.baseStat = 0;
stat.mod += Out1;
stat.mod += Out2;
Console.Write(stat.finalStat);
Out1和Out2分别是return1和2的函数。控制台写入 returned '2'。
我以前从未使用过 return 类型的委托,所以我不确定我的逻辑有什么问题。是否有类似的解决方案,甚至是完全不同的解决方法?
感谢您的帮助!
发生这种情况是因为默认情况下,调用多播将 运行 您使用 +=
添加的所有委托,但 return 值 returned 将是一个从你添加的最后一个。毕竟一次调用只能return一个值
如果您想要输出 3
,您可以使用 GetInvocationList
获取您使用 +=
添加到多播委托的委托。然后,您可以遍历数组并向上添加 return 值。
public float finalStat
{
get
{
float totalMod = 0;
foreach(Mod m in mod.GetInvocationList()) {
totalMod += m();
}
return baseStat + totalMod;
}
}
在这种情况下使用 delegate
和 GetInvocationList
的替代方法是 Func
:
var funcs = new List<Func<int>>();
funcs.Add(Out1);
funcs.Add(Out2);
funcs.Sum(f => f());
或使用您的 class:
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);