C # Изменение метки из другого класса

#c# #class #label #editing

#c# #класс #метка #редактирование

Вопрос:

Я большой новичок в 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;
        }
    }
  

Что я хочу сделать, так это то, что когда я покупаю Zombie, новая стоимость отображается в моей метке (ZCost), все работает, но не стоимость, что действительно странно. Новая стоимость Zombie вычисляется в классе Costs, а функция ZombieBuy() находится в классе Actions, который затем запускается кнопкой в моей основной форме.

Комментарии:

1. Что не работает? Когда вы выполняете это в отладчике, чем это отличается от того, что вы ожидаете?

2. Когда я запускаю его, когда я покупаю зомби, математический расчет предназначен для увеличения цены зомби на 1,25 (второй фрагмент кода), но это не так. Цена остается на уровне 10 и не меняется. В первом фрагменте кода с кодом для ZCost все в порядке, я проверил везде, перепробовал все, но цена по-прежнему не меняется после покупки zombie.

Ответ №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 объект, в отличие от того, чтобы возлагать на него ответственность за использование кода.

Комментарии:

1. Мой разум повсюду, где я мог бы переоценить это, не превращая это в метод? Я не могу думать прямо сейчас.

2. @user3787560: Ну, если вы не превращаете это в метод (или свойство), то он не будет повторно вычисляться. В этом случае вам нужно будет пересчитывать ее из потребляемого кода каждый раз, когда вы захотите ее изменить, что означало бы копирование / вставку того же математического выражения в другие места вашего кода. Почему бы просто не сделать это свойством? Это именно то, для чего предназначены свойства.

3. @user3787560: «как можно более организованный»? Это … не имеет большого смысла. Вы можете упорядочить свой код так, как вам нравится. Поместить свойство / метод / конструктор / и т.д. В объект так же просто, как и присвоить объекту значение.