C # изменяет ли изменение возвращаемого объекта класса исходное состояние?

#c# #class

#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] и это будет элемент, который я добавил ранее?

Комментарии:

1. ДА. Это изменит его. Прочитайте о ссылочных типах и о том, как они передаются в C #. Кроме того, почему вы спрашиваете, когда запуск небольшого примера программы покажет вам это?

2. Вам потребовалось бы меньше времени, чтобы запустить уже написанный код и выяснить это самостоятельно, чем потребовалось для написания этого вопроса.

3. @Servy не на моем компьютере, у меня был код на git, и мне было любопытно узнать о моей структуре / она просто не казалась на 100% правильной

4. @Adjit Тогда вы могли бы протестировать его, как только вернулись к своему компьютеру.

Ответ №1:

Объект является ссылочным типом. Это означает, что ссылка на объект возвращается из метода, а не копия объекта. Итак, да, вы меняете исходный элемент. Если вы сделаете это, вы можете получить недопустимое состояние вашего списка клиентов.

Одним из вариантов является возврат копии объекта. Самый простой способ сделать это — клонировать класс и его свойства, используя реализацию ICloneable .

Комментарии:

1. Почему это может привести к недопустимому состоянию кэша?

2. Что, если ваш кэш предполагает, что он никогда не меняется и всегда остается исходным элементом?