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

How do you instantiate a null reference parameter in a function?

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”保持为空。

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

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

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

既然你知道 C++,那就像 A**

考虑重构函数,使其returns成为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);

是否真的更好看具体情况。

都是关于在C#中按值或by reference传递参数的。

你做的是按值调用 如果改成引用调用就可以解决问题

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

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

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