从其他函数中获取变量

本文关键字:获取 变量 函数 其他 | 更新日期: 2023-09-27 18:15:43

假设我有以下代码:

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,但我不知道如何使用它。我试图将函数更改为public而不是protected,但我总是得到一个错误。

感谢您的宝贵时间。

编辑:我使用AJAX,这就是为什么总金额是两个功能。第一个我需要它,因为总金额的变化取决于用户的选择,然后点击他看到预览页。

从其他函数中获取变量

使用私有字段:

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 ;
}

与其假装我能解决你的问题,我真的觉得我没有足够的信息可以做,不如和你分享一个一般的原则:DRY或不要重复自己。在您的例子中,您有一段代码,希望在两个地方使用。到目前为止,您做得很好,因为计算只在一种方法中进行。这很好,也符合DRY原则。

现在有些人可能会想在两个方法之间剪切/粘贴代码。这将违反DRY原则,因为您将重复相同的代码,并且必须在两个地方维护它。更糟糕的是,它们可能会意外地出现分歧,开始做不同的事情,从而导致bug。通过直接使用另一个方法中的代码,您避免了这个陷阱。到目前为止,一切顺利。

下一步是重构以利用现有的代码。这就是它变得棘手的地方,因为您通常只想重用一部分代码。我怀疑在您的情况下,当您设置ltrl_previewText时,您并不总是想设置ltrl_showText。如果是这种情况,那么您应该引入第三个方法,前两个方法中的每一个调用都为这两个方法进行计算。

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 ;
}

现在唯一困扰我的是税率从何而来?这很可能取决于顾客从哪里点餐。在这种情况下,您可能需要引入第四个方法,该方法根据订购人员的位置进行某种查找,并返回该人员的适当税率。我把它留作练习。

我不知道这是否解决了你的问题,但这就是我要做重构的方式。想想你可以分享什么,以及这些东西从哪里获得数据。将其抽象为最可重用的代码。

EDIT:您确实应该使用decimal(或自定义Money类型)而不是double来表示Money, cf。,在c#中,什么是最好的数据类型?

你可以像这样重新安排你的代码:

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;
}

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()之前被调用。

如果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;
 }

和UI

ltrl_previewText = reservationFormTotalAmount;

尝试将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 ;    
    }   
}