#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: «как можно более организованный»? Это … не имеет большого смысла. Вы можете упорядочить свой код так, как вам нравится. Поместить свойство / метод / конструктор / и т.д. В объект так же просто, как и присвоить объекту значение.