2015-06-12 34 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

我正要發佈一些自己的東西(我打算進一步,並建議該類也應該是不可變的)。 –

相關問題