c#创建函数和引用对象

时间:2014-08-04 17:15:40

标签: c# function reference

这次我必须在函数中转换先前编写的代码并在代码中调用该函数。我在引用我的标签盒时遇到问题,似乎无法找到答案。这是代码:

private void btnEndSale_Click(object sender, EventArgs e)
{
    dblGrandTotal = dblSubtotal + dblTaxTotal;
    lbxTally.Items.Add("");
    lbxTally.Items.Add("");
    lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
    lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
    lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}

以及我试图将其变为:

static void PurchaseTotal(ref double dblSubtotal, ref double dblTaxTotal, ref double dblGrandTotal, object lbxTally)    
{
    dblGrandTotal = dblSubtotal + dblTaxTotal;
    lbxTally.Items.Add("");
    lbxTally.Items.Add("");
    lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
    lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
    lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}

所以我可以使用:

private void btnEndSale_Click(object sender, EventArgs e)           
{
    PurchaseTotal()
}

我有点迷失如何引用对象标签框(或者如果我需要?),如果我需要在调用它时在PurchaseTotal函数中再次引用我的变量。任何帮助表示赞赏!谢谢!

6 个答案:

答案 0 :(得分:4)

根据事物的外观,您需要的所有对象都作为类成员存在(例如,它们在表单本身中声明),因此您可以从任何实例方法中引用它们。

话虽如此,你应该能够做到这一点:

private void btnEndSale_Click(object sender, EventArgs e)
{
    PurchaseTotal();
}

private void PurchaseTotal()
{
    dblGrandTotal = dblSubtotal + dblTaxTotal;
    lbxTally.Items.Add("");
    lbxTally.Items.Add("");
    lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
    lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
    lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}

答案 1 :(得分:0)

您无法使PurchaseTotal成为静态。所以只需删除static关键字。

修改1

有两种方法可以做到这一点。一种方法是将方法保持为静态并传入标签。这是一个例子:

static void PurchaseTotal(LabelBox lbxTally, ref double dblSubtotal, ref double dblTaxTotal, ref double dblGrandTotal)    
{
    dblGrandTotal = dblSubtotal + dblTaxTotal;
    lbxTally.Items.Add("");
    lbxTally.Items.Add("");
    lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
    lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
    lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}

现在你需要将标签传递给函数......

private void btnEndSale_Click(object sender, EventArgs e)           
{
    PurchaseTotal(lbxTally, ref dblSubtotal, ref dblTaxTotal, ref dblGrandTotal);
}

另一种方法是删除静态因为你的lbxTally变量是本地的,静态方法不知道你的局部变量。所以你需要改变它看起来像这样

void PurchaseTotal()  
 {
      dblGrandTotal = dblSubtotal + dblTaxTotal;
      lbxTally.Items.Add("");
      lbxTally.Items.Add("");
      lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
      lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
      lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
  }

现在你调用这个没有参数的函数

private void btnEndSale_Click(object sender, EventArgs e)           
{
    PurchaseTotal();
}

答案 2 :(得分:0)

这一切都是在您需要将这些对象作为参数传递的前提下编写的,原因有这些。如果您允许在与您的活动相同的班级中使用实例方法,那么Trevor的答案就更好了。

lbxTally如果object具有Items属性,则不属于ListBox类型。尝试将鼠标悬停在它上面,然后工具提示会告诉你它是什么。然后,您可以更改参数类型以进行调整。例如,如果它说object lbxTally,您可以将参数从ListBox lbxTally更改为Go to Definition

或者,您可以通过打开设计器并查看该特定对象,或右键单击对该控件的引用并单击object并检查其声明方式来找到它。

当然,请注意,您必须检查原始方法中的类型。如果你对方法中已有的那个做了,它就不会工作。因为那已经是{{1}}。

答案 3 :(得分:0)

更改

object lbxTally

LabelBox lbxTally

或您正在使用的任何对象的名称。

对我来说,当我在表单上进行验证时,我会传递我要验证的控件,以便我可以更改其属性。所以我想在框中验证文本,我传入TextBox及其各自的Label。如果文本为空,则将标签更改为红色并标记布尔值。

我也在另一个问题中回答了这个问题:Passing data between class and form in C# using delegate parameter

答案 4 :(得分:0)

我不明白你为什么要将它重构为具有该签名的方法:

  • 当您要更改提供的值并允许调用者使用更新的值时,将使用ref关键字
  • lbxTallyobject类型的参数,它是最不具体的类型,您尝试访问特定于LabelBox的属性。为简单起见,可读性和速度,将参数类型更改为LabelBox
  • 一个名为PurchaseTotal()的方法会让我假设正在进行大量购买。您可能希望反映您在该方法中实际执行的操作,即:UpdatePurchaseTotalLabels()

(是的,我知道这不是代码审查网站,但它的评论太长了)

答案 5 :(得分:0)

ref关键字表示function can modify the parameter that is passed in。呼叫站点看起来像这样:

private void btnEndSale_Click(object sender, EventArgs e)           
{
    PurchaseTotal(ref dblSubtotal, ref dblTaxTotal, ref dblGrandTotal, lbxTally);
}

当然;这很傻。相反,您应该使用PurchaseTotal内的类中的字段,并从其定义中删除static修饰符:

void PurchaseTotal()    
{
    dblGrandTotal = dblSubtotal + dblTaxTotal;
    lbxTally.Items.Add("");
    lbxTally.Items.Add("");
    lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
    lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
    lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}

您的呼叫网站将根据需要变为

private void btnEndSale_Click(object sender, EventArgs e)           
{
    PurchaseTotal();
}