c#创建函数和引用对象

本文关键字:引用 对象 函数 创建 | 更新日期: 2023-09-27 18:16:42

这一次,我必须将之前编写的代码转换为函数,并在代码中调用该函数。我有一个问题时,引用我的标签框,似乎找不到答案。下面是代码:

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函数时是否需要再次引用我的变量,我有点迷失了。任何帮助都是感激的!谢谢!

c#创建函数和引用对象

从表面上看,你需要的所有对象都是作为类成员存在的(例如,它们在表单本身中声明),所以你可以从任何实例方法中引用它们。

话虽如此,您应该能够简单地这样做:

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

这些都是在这样或那样的原因要求您将这些对象作为参数传递的前提下编写的。Trevor的回答是,如果允许在事件所在的类中使用实例方法,那将是更好的实践。

如果

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

或者,您可以通过打开设计器并检查该特定对象来找到它,或者右键单击对控件的引用并单击Go to Definition并检查它是如何声明的。

当然,请注意,您必须检查原始方法中的类型。如果你对已经在方法中的那个做这个,它将不起作用。因为那已经是object

变化

object lbxTally

LabelBox lbxTally

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

对我来说,当我在一个表单上做验证时,我传递了我想要验证的控件,这样我就可以改变它们的属性。所以我想验证一个框中的文本,我传入TextBox和它各自的Label。如果文本为空,则将标签更改为红色并标记布尔值。

我已经在另一个问题中回答了这个问题:在c#中使用委托参数

在类和表单之间传递数据

我不明白你为什么要把它重构成一个带有那个签名的方法:

  • ref关键字用于更改提供的值并允许调用者使用更新后的值
  • lbxTally是类型object的参数,这是最不特定的类型,并且您正在尝试访问特定于LabelBox的属性。为了简单,可读性和速度,将参数类型更改为LabelBox
  • 一个名为PurchaseTotal()的方法会让我假设正在进行大量购买。你可能想要反映你在那个方法中实际做的事情,即:UpdatePurchaseTotalLabels()

(是的,我意识到这不是代码审查网站,但是作为评论它太长了)

ref关键字表示该函数可以修改传入的参数。调用站点看起来像这样:

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

您不能将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);
}

另一种方法是通过删除静态,因为你的lbxally变量是局部的,静态方法不知道你的局部变量。所以你需要把它改成这样

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