2017-01-28 45 views
-1

我想分配List<T>IEnumerable<T>靜態方法。這是我的代碼。分配列表<T>到IEnumerable <T>靜態方法

public class PlayController : Controller 
{ 
    // GET: Play 
    public ActionResult Index() 
    { 
     var a = new a(); 
     b.Test(a.ienuInt); 

     return View(); 
    } 
} 

public class a 
{ 
    public IEnumerable<int> ienuInt { get; set; } 

    public a() 
    { 
     ienuInt = new List<int>(); 
    } 
} 

public class b 
{ 
    public static void Test(IEnumerable<int> model) 
    { 
     var lists = new List<int>() { 1, 2, 3, 4 }; 
     model = lists; 
    } 
} 

我期望的aienuInt分配listsstatic void Test方法初始化。但Test方法後,ienuInt沒有任何東西。它的計數是0表示沒有分配給它。

有什麼問題嗎?因爲我認爲我可以將lists指定爲ienuInt,因爲通過ienuInt作爲參數意味着通過引用而不是值。

你能告訴我如何處理這個問題嗎?

+0

在這種情況下,沒有理由爲什麼'b.Test'方法不會返回'lists'並且沒有參數。 – Phil1970

+0

不會'測試(參考IEnumerable 模型)'工作? – QBrute

回答

0

你目睹的這個概念是一種「通過參考」與「通過價值傳遞」。

當您將對象傳遞給Test方法時,該方法內的變量model只是對原始對象的引用。當您將其分配給該方法中的新對象時,您只需更改引用即可。這不會修改原始對象。

舉例說明:

public static void Test(SomeObject model) 
{ 
    // Only changes which object in memory "model" points to. 
    // The original object outside of this method is unchanged. 
    // There are now two objects in memory. 
    model = new SomeObject(); 
} 

public static void Test(SomeObject model) 
{ 
    // There's still only one object in memory. 
    // The object which was passed to this method sees the change. 
    model.SomeProperty = someValue; 
} 

你的情況,你可以做的是這個新的對象,並將其設置爲可變的方法之外。因此,有方法返回新的對象:

public static IEnumerable<int> Test() 
{ 
    return new List<int>() { 1, 2, 3, 4 }; 
} 

然後調用代碼會處理更新其變量:

var a = new a(); 
a.ienuInt = b.Test(); 

或者你可以傳遞的a整個實例和更新的財產那個對象。事情是這樣的:

public static void Test(a model) 
{ 
    var lists = new List<int>() { 1, 2, 3, 4 }; 
    model.ienuInt = lists; 
} 

然後傳遞整個模型的方法:

var a = new a(); 
b.Test(a); 

在這種情況下仍然只會是a一個實例,因爲沒有在創建一個新的方法。該方法只是修改a上的一個屬性。


(旁註:。命名類和變量同樣的事情只是要求混淆堅持命名約定例如,調用類A和可變a

+0

因此「模型」存儲在「堆棧」內存中,它可以保存對堆內存中存儲的IEnumerable 的引用。因此,當我將新對象分配給它時,我只更改「堆棧」內存上「model」的引用。這樣對嗎? –

+0

@kisungTae:變量'model'就在那個方法(棧幀)中,是的。它只是一個指向堆中對象的指針。所以當你分配變量時,你只需要改變指針。但是,當您修改變量的屬性時,可以按照指向該對象的指針並修改該對象。 – David

+0

哦,感謝您的快速回復 –

相關問題