【问题标题】:Out argument of function call should maintain initialized value函数调用的输出参数应保持初始化值
【发布时间】:2013-10-10 17:49:44
【问题描述】:

我已经定义了一个函数,其中一个参数是 out。在这里,当进行函数调用时,我传递了一个已初始化或未初始化的参数。 现在,在初始化参数的情况下,如何让被调用者不改变out参数的值?

我不能在这里使用 ref,因为有时我确实会发送未初始化的参数。 例如:

void fun1()
{

    int x = 3;
    fun2 (out x);
    int y;
    fun2(out y);

}

void fun2(out int x)
{

    ...

}

在这里,我不希望 x 失去值 3 一旦控制转到 fun2。

【问题讨论】:

  • 如果你放一些代码来展示你在做什么,它会帮助我们想象如何帮助你。
  • 有点难以理解您想要实现的目标。 “out”意味着初始化(和值)是被调用方法的责任。你要求的完全相反。
  • 在上面的例子中,我只是想确保如果 out 参数在 fun2 调用之前已经在 fun1 中初始化,它应该保持该值不变,否则它可以初始化 fun2 中的参数。但是,既然已经出来了,fun2 必须给参数赋值,因为在第一次调用中,值 3 就丢失了。\
  • 只是出于好奇,你知道 int 总是初始化为 0 吗?

标签: c# out ref


【解决方案1】:

也许我弄错了,但这听起来你只是想定义一个这样的方法

void caller(){
int x=5;
int y = doSomething(x);
}

int doSomething(int x){
 return x+1;
}

或者如果你想要一个空状态使用:

void caller(){
int? x=5;
int y = doSomething(x);
}

int doSomething(int? x){
 if (x == null)
    return x;
 return x+1;
}

【讨论】:

  • 只有在有一个参数时才可以。如果还有更多呢?这就是为什么我使用 ref/out 并将函数返回类型设为 void
  • 在这种情况下定义类并使用对象
【解决方案2】:

来自out C# - MSDN

虽然作为输出参数传递的变量在传递之前不必初始化,但调用的方法需要在方法返回之前赋值

由于必须为out 的参数分配值,因此无法将值保存在函数中。如果在调用函数之前复制变量会更好。喜欢:

int x = 1;
int backupX = x;
fun2(out x);

【讨论】:

  • 听起来不错。谢谢。这让我想到了下一个问题。 ref 和有什么不一样?出去。
  • @TylerDurden,看到这个问题。它有非常详细的答案请参阅此问题:stackoverflow.com/questions/1516876/when-to-use-ref-vs-out
  • 我之前确实看到过这个问题,但它没有解释可为空的 ref 和 out 之间的区别
  • @TylerDurden,你所说的 nullable 是什么意思? Nullable<int> 或未初始化的int ?
  • 我的意思是 Nullable。未初始化的 int 不存在,因为它默认为 0 对吗?
猜你喜欢
  • 2012-01-07
  • 1970-01-01
  • 2014-05-19
  • 2012-05-22
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
相关资源
最近更新 更多