通过ref C#button_on_click

时间:2018-10-18 14:39:47

标签: c# onclick pass-by-reference

我正在创建一个捐赠应用程序,该应用程序将读取文本框中的输入,并将其转换为double。然后使用方法operatingCost,它应该将转换后的double值除以17%(营业费)。当前在该方法中,我进入了变量dontationBFees,然后将其除以17,然后创建一个新变量afterFees。我遇到的问题是我需要在该项目中通过ref,而我似乎无法访问afterFees变量。我需要获取参考文献afterFees并将其显示在我的afterFeesBox上。我的按钮on_click中也有此方法。任何帮助将不胜感激。下面是我的代码:

   private Double donationBFees = 0;


    private void button1_Click(object sender, EventArgs e)
    {
        String donationBeforeFees;
        Double aFees;
        String totalDonationRaised;

        donationBeforeFees = donationBox.Text;
        donationBFees = System.Convert.ToDouble(donationBeforeFees);

        void operatingCost(ref double afterFees)
        {
            afterFees = (donationBFees / 17);
        }


        afterFeesBox.Text = operatingCost(ref afterFees);


    }

3 个答案:

答案 0 :(得分:0)

调用byref会更改传递给函数的值,因此您需要传递一个您不介意更改的变量。

在此示例中,我有两件事叫做afterFees,因此我将其重命名为显而易见的一件事是参数。

contentForm cf = contentFrame.Content as contentForm;
if (cf != null)
{
    cf.Method();
}

您应该告诉您的教授,这实际上不是byref参数的好用法。如果该功能扣除了运营成本,则可能更有意义:

private Double donationBFees = 0;

void operatingCost(ref double afterFeesParam)
{
    afterFeesParam = (afterFeesParam / 17);
}

private void button1_Click(object sender, EventArgs e)
{
    String donationBeforeFees;
    Double aFees;
    String totalDonationRaised;

    donationBeforeFees = donationBox.Text;
    donationBFees = System.Convert.ToDouble(donationBeforeFees);

    double afterFees = donationBFees;
    operatingCost(ref afterFees);
    afterFeesBox.Text = afterFees;
}

这样,您可以给它一个值,然后返回的值会变小。

答案 1 :(得分:0)

一些(希望有帮助)的事情:

Promise

这意味着您要传递对app.get('/' , async (req, res) => { res.json(await members) console.log('Members: ',JSON.stringify(await members)) }) 的引用,并在方法中对void operatingCost(ref double afterFees) { afterFees = (donationBFees / 17); } 执行操作(在这种情况下,将其分配给afterFees),而不返回任何东西。但是,此行:

afterFees

表示您正在为该方法的结果分配donationBFees / 17,该方法的返回类型为afterFeesBox.Text = operatingCost(ref afterFees); ,因此无效。

您也永远不会声明Text,除非使用该方法(该方法无效)。我想您会收到一条错误消息:“名称...在当前上下文中不存在。”您需要在本地声明此变量(并将其重命名为不冲突):

void

那么您可以做些事情:

1)返回一个类型(您当前正在使用afterFees,但是,如注释中所建议,可能要使用double partAfterFees = 0; operatingCost(ref partAfterFees); )。然后,您可以根据需要删除double。然后,您可以执行以下操作:

decimal

但这似乎很奇怪,所以我可能会做(考虑到你所说的话):

ref

请注意,有一些“更好”的解决方案,涉及重构和检查有效输入等。但是,我认为这可以回答您的问题。

答案 2 :(得分:0)

我将方法从onClick中移出了,我更改了用于计算捐赠百分比(用户输入)的计算。我还格式化了输出,使其在小数点后仅显示两个位置,并显示一个美元符号。我仍然需要创建错误处理程序来验证用户输入,但这不应该成为问题。我对传球裁判有疑问,但我能更好地理解它的工作原理。谢谢大家的帮助!

private decimal donationBFees = 0;

    void deductOperatingCost(ref decimal afterFeesParam)
    {
        afterFeesParam = afterFeesParam - (afterFeesParam  / 100 * 17);
    }


    private void Button_Click(object sender, RoutedEventArgs e)
    {
        String donationBeforeFees;
        Decimal aFees;
        String totalDonationRaised;

        donationBeforeFees = donationBox.Text;
        donationBFees = System.Convert.ToDecimal(donationBeforeFees);


        decimal afterFees = donationBFees;
        deductOperatingCost(ref afterFees);
        afterFeesBox.Text = afterFees.ToString("$###, ##0.00");

    }