C# 使用'统计浮点加法;代表浮动';
我正在建立一个统计系统。在系统中,某些属性依赖于其他属性来计算其最终值。以下是我对此的最初尝试:C# 使用'统计浮点加法;代表浮动';,c#,delegates,C#,Delegates,我正在建立一个统计系统。在系统中,某些属性依赖于其他属性来计算其最终值。以下是我对此的最初尝试: public class ModdedStat { public delegate float Mod(); public Mod mod; public float baseStat; public float finalStat { get { return baseStat + mod();
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是分别返回1和2的函数。控制台写入返回“2”
我以前从未使用过返回类型委托,所以我不确定我的逻辑出了什么问题。有没有类似的解决方案,甚至是完全不同的解决方案
谢谢你的帮助 发生这种情况是因为默认情况下,调用多播将运行您使用
+=
添加的所有代理,但返回的值将是您上次添加的代理的返回值。毕竟,一个调用只能返回一个值
如果需要输出3
,可以使用获取使用+=
添加到多播代理的代理。然后,您可以在数组中循环并添加返回值
public float finalStat
{
get
{
float totalMod = 0;
foreach(Mod m in mod.GetInvocationList()) {
totalMod += m();
}
return baseStat + totalMod;
}
}
这是因为默认情况下,调用多播将运行您使用
+=
添加的所有代理,但返回的值将是您上次添加的代理的返回值。毕竟,一个调用只能返回一个值
如果需要输出3
,可以使用获取使用+=
添加到多播代理的代理。然后,您可以在数组中循环并添加返回值
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());
对于这种情况,使用
delegate
和GetInvocationList
的替代方法是Func
:
var funcs = new List<Func<int>>();
funcs.Add(Out1);
funcs.Add(Out2);
funcs.Sum(f => f());
你太棒了!非常感谢你的快速反应:)你太棒了!非常感谢您的快速结果:)答案如下