C#确实改变了返回的类对象改变原始状态?

问题描述:

假设我有下面的类结构: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

对象是引用类型。这意味着对象参考是从该方法返回的,而不是该对象的副本。所以,是的,你正在改变原来的项目。如果你这样做,你的客户名单可能会失效。

一种选择是返回对象的副本。最简单的方法是使用ICloneable的实现克隆类及其属性。

+0

这为什么会导致无效的缓存状态? – Adjit

+0

如果你的缓存假定它永远不会改变,并始终保持原来的项目? –