【问题标题】:C# Modifying a Label from another classC# 修改另一个类的标签
【发布时间】:2014-07-05 22:05:04
【问题描述】:

我是 c# 中的大新手,但我一直坚持一件烦人的事情。首先这是我遇到问题的代码:

        private void Refresher_Tick(object sender, EventArgs e)
    {
        LabelInf.Text = "Infected : " + Vars.infected; // Infected
        ZAmount.Text = "Zombies : " + Vars.zombies; // Zombies
        ZCost.Text = "Cost : " + Costs.ZombieCost; // Next Zombie Cost
    }
}

还有:

 class Costs
{
    internal static double ZombieCost = (Math.Floor(10 * Math.Pow(1.25, Vars.zombies)));
}

最后:

 public static void ZombieBuy()
    {
        if (Vars.infected >= Costs.ZombieCost) {
            Vars.zombies = Vars.zombies + 1;
            Vars.infected = Vars.infected - Costs.ZombieCost;
        }
        else
        {
            MessageBox.Show("Not Enough Infected To Sacrifice !","Insufficient Infected");
            return;
        }
    }

我想要做的是,当我购买僵尸时,新成本显示在我的标签 (ZCost) 中,一切正常,但成本却没有,这真的很奇怪。新的僵尸成本在 Costs 类中计算,ZombieBuy() 在 Actions 类中,然后由我的主窗体中的按钮触发。

【问题讨论】:

  • 什么不起作用?当您在调试器中单步执行此操作时,它与您的预期有何不同?
  • 当我运行它时,当我购买僵尸时 数学计算旨在使僵尸的价格增加 1.25(第二个代码片段),但它没有。价格保持在 10 不变。在 The First Code Snip 中,ZCost 的代码都很好,我检查了所有地方尝试了所有方法,但购买僵尸后价格仍然没有变化。

标签: c# class label editing


【解决方案1】:

你定义一个值:

internal static double ZombieCost = (Math.Floor(10 * Math.Pow(1.25, Vars.zombies)));

但是你在哪里修改过这个值?当类第一次静态加载时,定义值的表达式被评估一次。表达式本身不会被保存并在将来再次重新计算。

您的选择是在每次需要更新时修改值,或者将静态成员转换为静态方法,每次都会重新评估。例如:

internal static double ZombieCost
{
    get { return (Math.Floor(10 * Math.Pow(1.25, Vars.zombies))); }
}

这个属性(编译器在后台变成一个方法)会在每次被调用时重新计算,而不是在程序第一次加载时只计算一次。

我会推荐这种方法而不是继续修改值,因为这将计算值的逻辑和责任封装到 Costs 对象中,而不是让它成为使用代码的责任。

【讨论】:

  • 脑洞大开,不把它变成方法,我哪里可以重新评估它?我现在想不出来。
  • @user3787560:好吧,如果你不把它变成一个方法(或属性),那么它就不会重新评估。在这种情况下,您需要随时从消耗代码中重新计算它,这意味着在代码中的其他位置复制/粘贴相同的数学表达式。为什么不把它变成一个财产?这正是属性的用途。
  • @user3787560:“尽可能有条理”?这……没有多大意义。您可以随意安排代码。放置属性/方法/构造函数/等同样容易。就像在对象上放置一个值一样。
猜你喜欢
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
相关资源
最近更新 更多