C# 如何在函数中实例化空引用参数? < >如果我使用C++类比,我理解的是,虽然“a”是指向A类型的对象的指针,它是由函数通过引用访问的,但指针本身被用作值类型。最终结果是变量“a”保持为空
所以我的问题是,如果我想实例化变量,就像指针通过引用传递给函数一样,该怎么办?这是否可行?您可以通过引用传递变量:C# 如何在函数中实例化空引用参数? < >如果我使用C++类比,我理解的是,虽然“a”是指向A类型的对象的指针,它是由函数通过引用访问的,但指针本身被用作值类型。最终结果是变量“a”保持为空,c#,.net,pass-by-reference,pass-by-value,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 i
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**/COD> < < /P> 考虑重构函数,使其返回新值
a
:
function(ref A a)
function(ref a);
这是否真的更好取决于具体情况。这都是关于参数通过值或参数传入C#的问题 您所做的是按值调用 如果您将其更改为通过引用调用,则可以解决此问题
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);
您可以使用ref
或out
,但请不要使用!使用void
方法通过参数返回值是定义代码。这些关键字应被视为可与goto
(即语言支持它们,并且在某些边缘情况下可以使用它们,但它们应该是最后的工具)。相反,让函数返回以下值:
private static void function(ref A a)
{
if (a == null) a = new A();
a.B = 2;
a.C = 3;
}
在覆盖指针时,请注意这里的关键字Out是正确的。@MikeMiller该值也会出现。但这会产生可怕的副作用。您并不总是“覆盖指针”,因此需要在这里使用
ref
<代码>输出将无法编译。我自己也将发布一些类似的内容(我将更进一步,并建议该类也应该是不可变的)。
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