C# 方法输出值

本文关键字:输出 方法 | 更新日期: 2023-09-27 18:32:50

我是新的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

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

谢谢。

C# 方法输出值

你只是...分配给他们

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

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

例如,有关如何使用参数表,请查看 TryParse 方法。内置类型(例如 int.尝试解析,布尔。TryParse(。

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

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

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

非常感谢您的帮助。我只是不知道如何在方法调用中使用"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

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