Как запретить ссылкам на объект только для чтения изменять объект только для чтения?

Я хочу предоставить одному из моих классов значение или состояние по умолчанию. Мы назовем этот класс Foo и это выглядит так:

class Foo
{
    public static readonly Default = new Foo() { Bar = 42 };
    public int Bar { get; set; }
}

Это говорит о том, что я хочу значение по умолчанию для экземпляра Foo иметь своего члена, Bar, установите на 42. Проблема возникает, когда я делаю изменения в ссылке на Foo.Default,

void Function()
{
    Foo temp = Foo.Default;
    temp.Bar = 101; // Foo.Default.Bar = 101

    Foo anothertemp = Foo.Default; // anothertemp.Bar = 101!!
}

Как я могу избежать этого поведения?

2 ответа

Делать Foo неизменный.

public class Foo
{
    public static readonly Foo Default = new Foo(42);

    public Foo(int bar)
    {
        Bar = bar;
    }

    public int Bar { get; private set; }
}

Экспонирование полей считается плохой практикой в ​​большинстве случаев, так как это нарушает инкапсуляцию.

Для этого я предлагаю:

public static Foo Default { get { return new Foo (){ Bar = 42 }; } }

Если какой-либо аксесуар меняет значение по умолчанию, другие акценты могут использовать значение по умолчанию (но не ссылку!)

Другие вопросы по тегам