2015-06-12 33 views
2
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'保持为空。如何在函数中实例化一个空引用参数?

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

+2

看看的[参考](https://msdn.microsoft.com/en-us/library/14akc2c7.aspx)关键字 –

+0

出来是正确的在这里覆盖指针。 –

+1

@MikeMiller的价值也来了。 – usr

回答

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); 

如果是真正更好取决于具体的情况。

2

这是所有关于参数传递在C#中,值或by reference

你做了什么是价值,如果你改变它引用调用 调用它会解决这个问题

private static void function(ref A a) 
{ 
    if (a == null) a = new A(); 
    a.B = 2; 
    a.C = 3; 
} 
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 
+1

我正要发布一些自己的东西(我打算进一步,并建议该类也应该是不可变的)。 –

相关问题