только для установки свойств - PullRequest
2 голосов
/ 22 апреля 2010

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

Приветствия,

CA


Чтобы прояснить, что я имею в виду:

    private readonly List<SomeObject> _budget;
    public IEnumerable<SomeObject> Budget
    {
        get
        {
            return _budget;
        }
    }

Можетбыть доступным с

A.Budget=new SomeObject();

без компилятора {ошибка, предупреждение, сообщение}

Ответы [ 4 ]

8 голосов
/ 22 апреля 2010

Если ваше свойство имеет установщик, оно не только для чтения. Удалите сеттер, чтобы сделать его доступным только для чтения.

public string MyProperty // not read-only
{
    get { return myPropertyBacking; }
    set { myPropertyBacking = value; }
}

public string MyProperty // read-only
{
    get { return myPropertyBacking; }
}
8 голосов
/ 22 апреля 2010

Вы что-то здесь перепутали.В вашем примере компилятор выдаст ошибку, если вы попытаетесь сделать A.Budget=new SomeObject();, если свойство Budget в классе A не имеет установщика.С этого момента я могу только предположить в чем ваша проблема.

Я предполагаю, что вы хотите, чтобы коллекция, включенная в свойство Budget, была доступна только для чтения.Вероятно, поэтому вы сделали это IEnumerable<SomeObject>, тогда как приватный участник - List<SomeObject>.Поэтому, даже если у вас нет установщика, вы все равно можете сделать (A.Budget as List<SomeObject>).Add(bla).Чтобы запретить это, вы можете использовать List.AsReadOnly , например:

private readonly List<SomeObject> _budget;
public ReadOnlyCollection<SomeObject> Budget
{
    get
    {
        return _budget.AsReadOnly();
    }
}
3 голосов
/ 22 апреля 2010

Снять сеттер.

0 голосов
/ 22 апреля 2010

Как это не имеет смысла, но если вы имели в виду что-то подобное для вашего примера ...

private readonly List<SomeObject> _budget;
public List<SomeObject> Budget
{
    get
    {
        return _budget;
    }
}

Доступен с

A.Budget.Add(new SomeObject());

Это будет работать без ошибок.

EDIT

Последнее редактирование

bitbonk именно там, где я собирался с этим! Я просто ждал подтверждения проблемы.

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