如何在函数中实例化空引用参数?

时间:2015-06-12 11:47:38

标签: c# .net pass-by-reference pass-by-value

class A
{
    public int B { get; set; }
    public int C { get; set; }
}

private static void function(A a)
{
    if (a == null) a = new A();
    a.B = 2;
    a.C = 3;
}

A a = new A(); //a is not null
a = null; // a is null
function(a); 
//a is still null

如果我使用C ++类比,我理解的是虽然'a'是指向'A'类型的对象的指针,该对象由函数通过引用访问,但指针本身用作值类型。最终结果是变量'a'保持为空。

所以我的问题是,如果我想实例化变量,就好像指针通过引用传递给函数一样?这可行吗?

3 个答案:

答案 0 :(得分:2)

所有关于通过C#传递的参数,值或by reference

你所做的就是按价值来呼唤 如果你改变它以通过引用调用它将解决问题

private static void function(ref A a)
{
    if (a == null) a = new A();
    a.B = 2;
    a.C = 3;
}

答案 1 :(得分:2)

可以使用refout,但请不要!让void方法通过参数返回值是定义代码气味。这些关键字应该被视为与goto相当(即语言支持它们,并且有一些边缘情况可以使用它们,但它们应该是最后的工具)。相反,让你的函数返回值:

private static A function(A a)
{
    if (a == null) a = new A();
    a.B = 2;
    a.C = 3;
    return a;
}

A a = new A(); //a is not null
a = null; // a is null
a = function(a); // a is not null

答案 2 :(得分:1)

您可以通过引用传递变量:

function(ref A a)
function(ref a);

既然您了解C ++,那就像A**

考虑重构函数,使其返回新值a

private static A EnsureInitialized(A a) //renamed
{
    if (a == null) a = new A();
    a.B = 2;
    a.C = 3;
    return a; //now initialized
}

A a = ...; //maybe null
a = EnsureInitialized(a);

如果真的更好取决于具体案例。