Получить переменную из другой функции - PullRequest
0 голосов
/ 26 ноября 2011

Допустим, у меня есть следующий код:

protected void ReservationForm()
{
double x = 50;
double tva = 1.196;
double totalAmount = 0;

totalAmount = x * tva;

ltrl_showText = "Total Amount is " + totalAmount;
}

protected void btn_submit_Click(object sender, EventArgs e)
{
ltrl_previewText = "You ordered nameProduct at the price of " + totalAmount ;
}

Как я могу получить переменную totalAmount из функции выше?

Я знаю, что с Java я могу сделать это с super() и я обнаружил, что свойство равное на C # равно base, но я не знаю, как его использовать.Я пытался изменить функцию на публичную, а не на защищенную, но всегда получаю сообщение об ошибке.

Спасибо за ваше время.

РЕДАКТИРОВАТЬ: я использую AJAX, поэтому общие суммы указаны в обеих функциях.,Первый мне нужен, потому что общая сумма меняется в зависимости от выбора пользователя, а затем при нажатии он видит страницу предварительного просмотра.

Ответы [ 6 ]

2 голосов
/ 26 ноября 2011

Вместо того, чтобы притворяться, что я могу решить вашу проблему, которая, на самом деле, я не чувствую, что у меня достаточно информации, я поделюсь с вами общим принципом: СУХОЙ или Не повторяйте себя. В вашем случае у вас есть кусок кода, который вы хотите использовать в двух местах. До сих пор вы преуспеваете в том, что вычисления производятся только одним методом. Это хорошо и соответствует принципу СУХОЙ.

Теперь некоторые люди захотят просто вырезать / вставить код между двумя методами. Это нарушило бы принцип СУХОГО, потому что вам пришлось бы повторять один и тот же код и поддерживать его в двух местах. Хуже того, они могут случайно отклониться и начать делать разные вещи, приводящие к ошибкам. Вы избежали этой ловушки, желая напрямую использовать код в другом методе. Пока все хорошо.

Следующим шагом является рефакторинг, чтобы воспользоваться существующим кодом. Вот где это может быть сложно, потому что вы, как правило, хотите повторно использовать только часть кода. В вашем случае я подозреваю, что вы не всегда хотите устанавливать ltrl_showText всякий раз, когда вы устанавливаете ltrl_previewText. Если это так, то вы должны ввести третий метод, который каждый из первых двух вызывает, который выполняет вычисления для обоих.

protected decimal CalculateAmount()
{
   decimal x = 50;
   decimal tva = 1.196;
   decimal totalAmount = 0;

   return x * tva;
}

protected void ReservationForm()
{
   decimal totalAmount = CalculateAmount();
   ltrl_showText = "Total Amount is " + totalAmount;
}

protected void btn_submit_Click(object sender, EventArgs e)
{
    decimal totalAmount = CalculateAmount();
    ltrl_previewText = "You ordered nameProduct at the price of " + totalAmount ;
}

Теперь вы можете подумать, что мы закончили, но я не считаю это очень полезным. totalAmount всегда одинаков. Это не кажется очень полезным. На данный момент, однако, я должен войти в сферу чистой догадки. Ясно, что значения, используемые для функции, берутся не из констант в коде, по крайней мере, цена должна быть, если не налоговая ставка. Вопрос в том, приходят ли они из одного места и для ReservationForm, и для обработчика нажатия кнопки. Я подозреваю, что нет, поэтому самый разумный подход - заставить CalculateAmount принять один или несколько параметров.

public decimal CalculateAmount( double cost )
{
    decimal tva = 1.196;
    return cost * tva;
}

protected void ReservationForm()
{
   decimal cost = ...where do we get cost from? a database, a previous form, ???
   decimal totalAmount = CalculateAmount(cost);
   ltrl_showText = "Total Amount is " + totalAmount;
}

protected void btn_submit_Click(object sender, EventArgs e)
{
    decimal cost = double.Parse( inp_ProductOrdered.Text ); // seems reasonable on a button click
    decimal totalAmount = CalculateAmount(cost);
    ltrl_previewText = "You ordered nameProduct at the price of " + totalAmount ;
}

Теперь единственное, что меня до сих пор беспокоит, это откуда берется налоговая ставка? Вероятно, это зависит от того, откуда заказывает человек. В этом случае вам, вероятно, потребуется ввести четвертый метод, который выполняет какой-то поиск в зависимости от местоположения человека, выполняющего заказ, и возвращает соответствующую налоговую ставку для этого человека. Я оставлю это как упражнение.

Я понятия не имею, решит ли это вашу проблему, но именно так я бы сделал рефакторинг. Подумайте о том, что вы можете поделиться и где эти вещи получают свои данные. Абстрагируй это от кода, который ты можешь использовать повторно.

РЕДАКТИРОВАТЬ : Вы действительно должны использовать decimal (или пользовательский тип денег) вместо double для денег, ср. , Что лучше тип данных для использования в деньгах в c #?

2 голосов
/ 26 ноября 2011

Используйте личное поле:

private double totalAmount;

protected void ReservationForm()
{
    double x = 50;
    double tva = 1.196;
    this.totalAmount = x * tva;
    ltrl_showText = "Total Amount is " + this.totalAmount;
}

protected void btn_submit_Click(object sender, EventArgs e)
{
    ltrl_previewText = "You ordered nameProduct at the price of " + this.totalAmount ;
}
1 голос
/ 26 ноября 2011

Вы можете изменить код следующим образом:

protected double ReservationForm()
{
    double x = 50;
    double tva = 1.196;
    double totalAmount = 0;

    totalAmount = x * tva;   

    return totalAmount;
}

protected void btn_submit_Click(object sender, EventArgs e)
{
    double TotalAmount;

    TotalAmount = ReservationForm();

    ltrl_previewText = "You ordered nameProduct at the price of " + TotalAmount;
    ltrl_showText = "Total Amount is " + TotalAmount;
}
0 голосов
/ 26 ноября 2011

попробуйте сделать totalAmount приватным полем:

class foo {
   private double totalAmount;  

   protected void ReservationForm() 
   { 
     double x = 50; 
      double tva = 1.196; 

      totalAmount = x * tva; 

      ltrl_showText = "Total Amount is " + totalAmount; 
    }    
    protected void btn_submit_Click(object sender, EventArgs e)    
    {    
       ltrl_previewText = "You ordered nameProduct at the price of " + totalAmount ;    
    }   

}
0 голосов
/ 26 ноября 2011

Если ReservationForm () находится в коде позади, вы можете присвоить значение защищенному свойству (которое доступно для части дизайна asp.net страницы), например:

 protected string reservationFormTotalAmount;

 protected void ReservationForm()
 {
   double x = 50;
   double tva = 1.196;
   double totalAmount = 0;
   totalAmount = x * tva;

   reservationFormTotalAmount = "Total Amount is " + totalAmount;
 }

и впользовательский интерфейс

ltrl_previewText = reservationFormTotalAmount;
0 голосов
/ 26 ноября 2011

totalAmount является локальной переменной. Это означает, что к нему можно получить доступ только из его метода.

Вместо этого вы можете сделать это поле, и тогда оно будет иметь более широкий охват.

protected double totalAmount;

protected void ReservationForm() 
{ 
    double x = 50;   
    double tva = 1.196;
    totalAmount = x * tva;  
    ltrl_showText = "Total Amount is " + totalAmount; 
} 

Конечно, вы хотите убедиться, что ReservationForm() вызывается до btn_submit_Click().

...