Как запретить ссылкам на объект только для чтения изменять объект только для чтения?
Я хочу предоставить одному из моих классов значение или состояние по умолчанию. Мы назовем этот класс 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 }; }
}
Если какой-либо аксесуар меняет значение по умолчанию, другие акценты могут использовать значение по умолчанию (но не ссылку!)