Есть ли способ установить свойство один раз только в C # - PullRequest
61 голосов
/ 08 мая 2009

Я ищу способ разрешить установку свойства в объекте C # только один раз. Для этого легко написать код, но я бы предпочел использовать стандартный механизм, если он существует.

public OneShot<int> SetOnceProperty { get; set; }

Я хочу, чтобы это свойство могло быть установлено, если оно еще не установлено, но выдает исключение, если оно было установлено ранее. Он должен работать как значение Nullable, где я могу проверить, установлено ли оно или нет.

Ответы [ 13 ]

0 голосов
/ 13 ноября 2013

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

Обобщения только для примитивов: T GetObject, где T: struct;

Это не нужно, если вы знаете, что объекты, которые получают ссылку на данные, никогда не будут перезаписывать их.

Кроме того, подумайте, будет ли ReadOnlyCollection работать для вашего приложения. исключение выдается при попытке изменения данных.

0 голосов
/ 23 сентября 2012
interface IFoo {

    int Bar { get; }
}

class Foo : IFoo {

    public int Bar { get; set; }
}

class Program {

    public static void Main() {

        IFoo myFoo = new Foo() {
            Bar = 5 // valid
        };

        int five = myFoo.Bar; // valid

        myFoo.Bar = 6; // compilation error
    }
}

Обратите внимание, что myFoo объявлен как IFoo, но создан как Foo.

Это означает, что Bar можно установить в блоке инициализатора, но не через более позднюю ссылку на myFoo.

0 голосов
/ 08 мая 2009

Вы можете сделать это, но это не ясное решение, и читаемость кода не самая лучшая. Если вы занимаетесь разработкой кода, вы можете взглянуть на реализацию singleton в тандеме с AOP на перехватывать сеттеры. Реализация всего за 123 :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...