2016-10-03 78 views
0

假設我有下面的類結構:C#確實改變了返回的類對象改變原始狀態?

public class spaList 
{ 
    private List<customerItemFulfillment> customers; 

    public customerItemFulfillment addNewCustomer(
     string customerNumber, string customerName) 
    { 
     customers.Add(new customerItemFulfillment(customerNumber, customerName)); 
     return customers[customers.Count - 1]; 
     //Would running .addItem() on this returned object affect the object in the list? 
    } 
} 

public class customerItemFulfillment 
{ 
    public string customerNumber { get; } 
    public string customerName { get; } 
    public List<itemFulfillment> fulfillmentItems { get; } 

    public void addItem(string itemNumber, double rebateAmount, 
         double fulfillmentPercent) 
    { 
     fulfillmentItems.Add(new itemFulfillment(itemNumber, 
        rebateAmount, fulfillmentPercent)); 
    } 

    public customerItemFulfillment(string customerNumber, string customerName) 
    { 
     this.customerNumber = customerNumber; 
     this.customerName = customerName; 
    } 
} 

如果我不喜歡的東西:

spaList spaListings = new SpaList(); 
customerItemFulfillment newCustomer = spaListings.addNewCustomer(
            "customer name", "customer number"); 
newCustomer.addItem("item number", 25.00, 8.0); 

這是否改變customerItemFulfillment對象spaList.customers或者是它只是一個該對象的副本?

即。我以後能夠做些什麼 - spaListings.customers[0].fulfillmentItems[0],並且那是我之前添加的項目嗎?

+2

是的。它會改變它。閱讀關於引用類型以及它們如何在C#中傳遞。另外,你爲什麼要問,當運行小樣本程序會告訴你? – Euphoric

+1

這會讓你花更少的時間來運行你已經編寫的代碼,並找出你自己的代碼,而不是你寫這個問題。 – Servy

+0

@Servy不是我的電腦,並在git上有代碼,並對我的結構感到好奇/它只是感覺不到100%正確 – Adjit

回答

0

對象是引用類型。這意味着對象參考是從該方法返回的,而不是該對象的副本。所以,是的,你正在改變原來的項目。如果你這樣做,你的客戶名單可能會失效。

一種選擇是返回對象的副本。最簡單的方法是使用ICloneable的實現克隆類及其屬性。

+0

這爲什麼會導致無效的緩存狀態? – Adjit

+0

如果你的緩存假定它永遠不會改變,並始終保持原來的項目? –