从其他函数中获取变量
本文关键字:获取 变量 函数 其他 | 更新日期: 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 ;
}
}