Как запретить ссылкам на объект только для чтения изменять объект только для чтения? - PullRequest
0 голосов
/ 26 декабря 2011

Я хочу предоставить одному из моих классов значение или состояние по умолчанию.Мы назовем этот класс 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 ]

1 голос
/ 26 декабря 2011

Сделать Foo неизменным.

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

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

    public int Bar { get; private set; }
}

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

0 голосов
/ 26 декабря 2011

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

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

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

...