在分配之前获取out参数的值

时间:2013-11-13 10:39:37

标签: c# parameter-passing params out param

我正在更新包含out参数的方法。在将参数设置为默认值之前,我需要检查参数的值。

public int DoWork(out int param)
{
    param = 0;
}

然而,当我尝试做这样的事情时

public int DoWork(out int param)
{
    if(param == 8)
        param = 0;
}

我收到错误消息“使用未分配的参数'参数'”

有没有办法可以在分配之前使用传递给方法的值?

更新:我无法使用ref关键字。很多代码都会破坏,而且它不是设计的一部分

4 个答案:

答案 0 :(得分:3)

您可以使用ref关键字。

public int DoWork(ref int param)
{
    if(param == 8)
        param = 0;
}

这样,您可以为参数指定一个新值,但也可以使用旧值。看看http://msdn.microsoft.com/en-us//library/14akc2c7.aspx

答案 1 :(得分:3)

如果你真的需要并且想作弊,你可以。这是示例代码:

using System;
using System.Reflection.Emit;

namespace Test774
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            var a = 666;
            DoWork(out a);
        }

        public static int DoWork(out int param)
        {
            var dynamicMethod = new DynamicMethod("ParameterExtractor", typeof(int), new [] { typeof(int).MakeByRefType() });
            var generator = dynamicMethod.GetILGenerator();
            generator.Emit(OpCodes.Ldarg_0);
            generator.Emit(OpCodes.Ldind_I4);
            generator.Emit(OpCodes.Ret);
            var parameterExtractor = (MethodWithTheOutParameter)dynamicMethod.CreateDelegate(typeof(MethodWithTheOutParameter), null);
            Console.WriteLine(parameterExtractor(out param));
            param = 1;
            return 0;
        }

        public delegate int MethodWithTheOutParameter(out int a);
    }
}

答案 2 :(得分:2)

您应该使用“ref”关键字而不是“out”。

“Out”具体表示参数在方法中初始化并赋值,之前无需初始化,因此编译器假定参数刚刚声明但没有值。

相反,“参考”完全符合您的要求。

public int DoWork(ref int param)
{
    if(param == 8)
        param = 0;
}

//your code:
int val = 5;
DoWork(ref val);
val.ToString(); // outputs 5
val = 8;
DoWork(ref val);
val.ToString(); // outputs 0

答案 3 :(得分:1)

  

有没有办法可以在分配之前使用传递给方法的值?

不,没有,也没有任何价值(零或垃圾)。