1

我是 C# 新手,目前正在阅读 Murach 的 C# 2012。我遇到了为定义为 out 的参数赋值的方法,我对此感到有些困惑。在其他语言中,如果一个方法需要返回多个值,则可以返回一个包含多个值的对象。但是我不确定如何在方法中使用“out”。我也一直在关注 MSDN 在线资源,但仍然不清楚如何使用“out”。例如,如果我想编写一个接受四个参数的方法,我如何让这个方法为定义为“out”的参数赋值。

private void calcValues(decimal decVal, out decimal decHigh, out decimal decMid, out decimal decLow)
{
    decimal highVal = 0.00M;
    decimal midVal = 0.00M;
    decimal lowVal = 0.00M;

    highVal = (decVal * decHigh);
    midVal = (decVal * decMid);
    lowVal = (decVal * decLow);

}//CALCVALUES METODH END

如果有人能帮助我理解这种“出局”机制,我将不胜感激。我已经对此进行了在线搜索,但无法提出一个简单的香草示例。

谢谢你。

4

4 回答 4

5

你只是......分配给他们

decHigh = 0M;
decMid = 13M;
decLow = 42M;

请注意,因为它们是out,所以在“明确分配”之前您无法读取它们;它们在进入时的值没有定义。这是为了让调用者可以这样做:

decimal foo;
if(SomeMethod("bar", out foo)) {...}

而不必为 分配任意值foo

decimal foo = 0M;
if(SomeMethod("bar", ref foo)) {...}

但是,正如您所指出的:out了解甚少。您也可以考虑简单地返回具有3 个值的内容:

private SomeType CalculateValues(decimal decVal) {
    //... some maths...
    return new SomeType(...);
}
于 2013-09-24T21:20:20.863 回答
0

非常感谢您的帮助。我只是不知道如何在方法调用中对一个或多个值使用“out”。Murach 的 2012 C# 是一本好书,但缺少一些细节,但这只是我的看法。所以这就是我最终使用“out”的方式:

    decimal cdecLUX_RATE = 0.06M;               //LUXURY TAX RATE
    decimal cdecSTATE_RATE = 0.05M;             //STATE TAX RATE
    decimal cdecDEALER_FEES = 0.15M;            //DEALER FEES

    decimal decFullPrice = 30000.0M             //FULL PRICE
    decimal decLuxTax = 0.00M;                  //LUX TAX
    decimal decStateTax = 0.00M;                //STATE TAX 
    decimal decDealerFees = 0.00M;              //DEALER FEES  


    //CALCTAXES METHOD CALL
    calcTaxes(decFullPrice, out decLuxTax, out decStateTax, out decDealerFees);     

    private void calcTaxes(decFullPrice, out decimal decLuxTax, out decimal decStateTax, out decimal decDealerFees)
    {
        decLuxTax = (decFullPrice * cdecLUX_RATE);
        decStateTax = (decStatePrice * cdecSTATE_RATE);
        decdecDealerFees = (decFullPrice * cdecDEALER_FEES);
    }//CALCTAXES METODH END

这可能不是正确的方法,但我仍然被它弄湿了。谢谢你。

于 2013-10-01T00:04:59.280 回答
0

您并没有真正为这些输出变量分配任何东西,这就是它们没有被修改的原因。进行任何计算后,只需将您希望存储的值分配给这些变量。请注意,您不必在方法中重新声明它们。

于 2013-09-24T21:24:33.087 回答
0

例如,如何使用 out 参数,请查看内置类型的 TryParse 方法(例如 int.TryParse、bool.TryParse)。

将参数指定为“out”允许被调用的过程为参数分配一个值,分配给参数的值将成为实际参数(传入的变量)的值。事实上,被调用的过程必须赋值。对于 TryParse 方法,它将是解析的结果,或者是默认值或类型的默认值(例如 0 或 false)。这是通过使用间接还是通过使用复制机制来实现的,我不知道。可能取决于它是结构还是类。

在 C# 中,调用者和被调用过程都必须用 out 参数标记参数。显然,实际参数必须是左值(即可以分配的变量或位置)。

您可能会感到困惑,因为 C# 中的几乎所有内容都是引用,这意味着您始终可以更改传递给过程的对象的公共属性/字段。输出机制允许您更改实际参数引用的对象。

于 2013-09-24T21:39:26.727 回答