【问题标题】:Get value of out parameter before assigning在分配之前获取out参数的值
【发布时间】:2013-11-13 10:39:37
【问题描述】:

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

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

但是,当我尝试做这样的事情时

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

我收到一条错误消息,提示 “使用未分配的输出参数 'param'”

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

更新:我不能使用 ref 关键字。很多代码会中断,这不是设计的一部分

【问题讨论】:

  • 你必须使用关键字 ref
  • 我认为您对 out 关键字的作用感到困惑。也许您打算使用ref
  • 你可以改用ref参数
  • 我无法将其更改为 ref。许多其他代码会中断。
  • @miguelarcilla 你可以通过调用 pointer 之类的东西来破解它,但我不赞成这样的事情 ;)

标签: c# parameter-passing params out param


【解决方案1】:

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

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

【讨论】:

  • 这是一个很好的答案。如果未分配该值,它将给您 0。
  • 我没有看到这样做是一个非常糟糕的主意的大警告信号 :)
【解决方案2】:

你可以使用ref关键字。

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

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

【讨论】:

    【解决方案3】:

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

    “Out”具体表示参数在方法中初始化并赋值,之前不需要初始化,所以编译器认为参数只是声明了,没有值。

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

    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
    

    【讨论】:

    • 谢谢,但我不能更改它。如果我这样做会破坏很多东西
    • 那么不,你无法获得价值。 out 关键字不是这样工作的,out 只是用于从函数中输出值。如果您需要该值然后想要更新它,则使用 Ref 。
    • 按照设计,你根本无法做你想做的事。
    • 好的,感谢您的提醒,我想我得想办法解决它了。
    【解决方案4】:

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

    不,没有,而且它也没有任何值(零或垃圾)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 2023-03-31
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多