有没有办法在使用我们自己的方法时返回多个选项?

时间:2016-07-07 19:15:53

标签: c# variables methods return-value

我正在创建一个应用程序,其中用户使用复选框选择一个或两个选项,然后单击计算按钮并显示总价格

为此,我必须使用我自己的方法,例如Oil和Lube部分,并使用click事件处理程序调用它来显示标签框中的值。

  

以下是PIC:

(仅考虑油和润滑油及总费用) enter image description here

问题是我想要返回多个选项,一个用于(如果用户选择换油),第二个用于(如果用户选择润滑油作业)和最后一个(如果用户选择了这两个选项),但是我只能返回这两种情况的选择值。

  

这是我的代码(我自己的方法)

private decimal OilLubeCharges(ref decimal ValueTotal, ref decimal ValueOilChange, ref decimal ValueOilLube )
        {
           decimal oilChange_var=0m;
           decimal lubeJob_var=0m;
           decimal oilLube_var=0m;
           decimal totalOiltLubeCharges_var = 0m;

            if (oilChangeCheckBox.Checked && lubeJobCheckBox.Checked)
            {
                oilChange_var = 26.00m;
                lubeJob_var = 18.00m;

                totalOiltLubeCharges_var = oilChange_var + lubeJob_var;

            }

            else if (oilChangeCheckBox.Checked)
            {
                oilChange_var = 26.00m;

            }

            else if (lubeJobCheckBox.Checked)
            {
                lubeJob_var = 18.00m;
            }

            return oilChange_var;

            }    
  

以下是代码(CALCULATE BUTTON CLICK EVAND HANDLER)

private void calculateButton_Click(object sender, EventArgs e)
        {
            decimal totalOilLubeChargesAccept_var = 0m; 
            decimal oilChangeAccept_var = 0m;
            decimal oilLubeChangesAccept_var =0m;

           decimal storeValue = OilLubeCharges(ref totalOilLubeChargesAccept_var, ref oilChangeAccept_var, ref oilLubeChangesAccept_var );

           totalFeesAnsLabelBox.Text = storeValue.ToString();


        }

正如您所看到的,我只能使用return语句,例如return oilChange_var,但totalOiltLubeCharges_var& lubeJob_var

我想找到一种方法,为每种情况返回多个选项(如果是这种情况),然后在用户点击“计算”按钮(IN CLICK EVENT HANDLER)后,在进行其中任一选择后,将值显示在标签框中。

  

编辑:

使用out参数它会给出错误"必须在out参数离开当前方法之前将其分配给#34;

这是我的方法,带有out参数:

private decimal OilLubeCharges(out decimal ValueTotal, out decimal ValueOilChange, out decimal ValueOilLube )
        {
            decimal oilChange_var=0m;
           decimal lubeJob_var=0m;
           decimal oilLube_var=0m;
           decimal totalOiltLubeCharges_var = 0m;


            if (oilChangeCheckBox.Checked && lubeJobCheckBox.Checked)
            {
                oilChange_var = 26.00m;
                lubeJob_var = 18.00m;

                totalOiltLubeCharges_var = oilChange_var + lubeJob_var;

            }

            else if (oilChangeCheckBox.Checked)
            {
                oilChange_var = 26.00m;

            }

            else if (lubeJobCheckBox.Checked)
            {
                lubeJob_var = 18.00m;
            }

            return totalOiltLubeCharges_var;

        }  

这是点击事件方法:

private void calculateButton_Click(object sender, EventArgs e)
        {
            decimal totalOilLubeChargesAccept_var;
            decimal oilChangeAccept_var;
            decimal oilLubeChangesAccept_var;

           decimal storeValue = OilLubeCharges(out totalOilLubeChargesAccept_var, out oilChangeAccept_var, out oilLubeChangesAccept_var );


           totalFeesAnsLabelBox.Text = storeValue.ToString();

2 个答案:

答案 0 :(得分:3)

您有多个选项,可以返回:

1- Tuple<decimal,decimal, decimal>

用法:

private Tuple<decimal, decimal, decimal> MyMethod(out decimalValue, 
                                                 out SomeValue2, out SomeValue3)
{
return Tuple.Create(decimalvariable1, decimalvariable2);
}

2- 创建结构或类

public class DataHolder
{
   public decimal OilValue { set; get; }
   public decimal SomeValue2 { set; get; }
   public decimal SomeValue3 { set; get; }
}

3-使用参数:

private decimal MyMethod(out decimalValue, out SomeValue2, out SomeValue3)
{
       // logic here
       decimalValue = val1;
       SomeValue2 = val12;
       SomeValue3 = val3

       return decimalValue + SomeValue3;
       //Or return SomeValue2;
       // Or Whatever decimal variable or value
}

这样称呼:

decimal decimalValue;
decimal SomeValue2;
decimal SomeValue3;

MyMethod(out decimalValue, out SomeValue2, out  SomeValue3);
// decimalValue, SomeValue2 and SomeValue3 now hold
// the values that were set inside the method.

检查此工作Example

答案 1 :(得分:0)

另一种选择是使用动态

private dynamic OilLubeCharges()
{
    // Process oilChange_var, totalOiltLubeCharges_var, lubeJob_var.

    return new { oilChange_var, totalOiltLubeCharges_var, lubeJob_var };
}

然后使用:

dynamic storeValue = OilLubeCharges();

totalFeesAnsLabelBox.Text = storeValue.totalOiltLubeCharges_var.ToString();
otherTextBox.Text = oilChange_var.ToString();
yetAnother.Text = lubeJob_var.ToString();

但是当我明白发生了什么时,我会小心使用它,动态会面临更多运行时错误的危险。

C#7 的愿望清单中有一个功能可以解决此问题:

private (decimal oil, decimal oilLube, decimal lube) OilLubeCharges()
{
    oil = 0
    oilLube = 1
    lube = 2
}

Tuples in C# 7