Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在函数中实例化空引用参数? < >如果我使用C++类比,我理解的是,虽然“a”是指向A类型的对象的指针,它是由函数通过引用访问的,但指针本身被用作值类型。最终结果是变量“a”保持为空_C#_.net_Pass By Reference_Pass By Value - Fatal编程技术网

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