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'保持为空。
所以我的问题是,如果我想实例化变量,就好像指针通过引用传递给函数一样?这可行吗?
答案 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)
你可以使用ref
或out
,但请不要!让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);
如果真的更好取决于具体案例。