C#out带空检查的参数

时间:2017-06-22 17:43:18

标签: c#

我想在调用函数之前使用可能未分配的outref参数。然后该函数负责检查参数是否存在,如果不存在,则创建并返回一个新对象。

以下是我正在尝试完成的一些示例C#代码:

public virtual object MyFunction(out object myObject)
{
    if (myObject == null)
        myObject = new Object();

    // do some more things here...
    // maybe return myObject, or perhaps something else
    return myObject;
}

我希望下面四个示例函数调用中的每一个都被认为是有效的:

Object x = new Object();
MyFunction(x);               // x gets passed by reference
Object y = MyFunction(x);
Object z = MyFunction();
Object u = MyFunction(null);

我在第3行收到错误,告诉我Out parameter 'list' might not be initialized before accessing。尝试为myObject提供默认值会产生错误A 'ref' or 'out' parameter cannot have a default value

有没有办法使用out参数(通过引用传递)并在将它们分配给任何内容之前检查这些引用是否已经初始化

3 个答案:

答案 0 :(得分:4)

不,这是不可能的。如果使用out参数,则在分配给变量之前不允许读取该值,因为编译器已经告诉过您。如果您使用ref,则必须先参数进行初始化,然后才能传入。

答案 1 :(得分:0)

当方法没有其他任何东西可以返回时,返回值大部分时间都是正确的选择。

它只会阻止调用者分别声明变量。例如:

int x1;
GetValue(out x1);

声明变量:

int? x1 = GetValue();

您可以在MSDN documentation了解更多相关信息。

答案 2 :(得分:0)

当您将 null 作为输出参数传递时,例如通过使用 out _,CLR 将在您第一次使用参数时分配临时存储空间,因此无需进行无法编译的初始检查。

Before assignment

越过这一行(也不例外):

After assignment

呼叫是double result = TestMethods.DoubleValue(2.5, out _);