Как установить значение свойства, доступного только для чтения, с помощью общих методов получения и установки? - PullRequest
8 голосов
/ 19 февраля 2009

Не уверен, правильно ли я сформулировал это ... но у меня есть следующий код:

    public Guid ItemId
    {
        get;
    }

    public TransactionItem()
    {
        this.ItemId = Guid.Empty;
    }

Естественно, я получаю проблему только для чтения ... которую я понимаю. В любом случае можно установить значение этого свойства без необходимости делать что-то вроде ниже:

    Guid _itemId = Guid.Empty;
    public Guid ItemId
    {
        get
        {
            return _itemId;
        }
        set
        {
            _itemId = value;
        }
    }

или

    public Guid ItemId
    {
        get;
        internal set;
    }

Заранее спасибо!

Ответы [ 5 ]

32 голосов
/ 19 февраля 2009

Я бы пошел на это:

public Guid ItemId
{
    get;
    private set; // can omit as of C# 6 
}

public TransactionItem()
{
    this.ItemId = Guid.Empty;
}

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

По моему мнению, такие вещи, как свойства только для чтения, наиболее важны при взгляде снаружи. Изнутри не имеет значения, что это, потому что там ты - король =)

4 голосов
/ 19 февраля 2009

Если вам просто нужно, чтобы свойство ItemId было доступно только для чтения внешним пользователям вашего класса, то ответ Свиша - это путь.

Если вам нужно, чтобы ItemId был доступен только для чтения внутри самого класса, вам нужно сделать что-то вроде этого:

private readonly Guid _ItemId
public Guid ItemId
{
    get { return _ItemId; }
}

public TransactionItem()
{
    _ItemId = Guid.Empty;
}
2 голосов
/ 19 февраля 2009

Боюсь, ваш вопрос не очень понятен - но если не определен определитель свойства, вы, конечно, не сможете его вызвать.

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

Просто чтобы расширить то, что я имею в виду, я бы хотел бы , чтобы иметь возможность:

// Not valid in C# - yet!
public class Foo
{
    // Autogenerated field would be readonly in IL.
    public string Name { get; readonly set; }

    public Foo (string name)
    {
        this.Name = name;
    }

    public void Bar()
    {
        // This would be invalid
        this.Name = "No!";
    }
}

По сути это было бы "сделать свойство похожим на поле только для чтения".

2 голосов
/ 19 февраля 2009

Вы можете использовать readonly ключевое слово

public readonly Guid ItemId;

public TransactionItem()
{
    this.ItemId = Guid.Empty;
}
0 голосов
/ 19 февраля 2009

Использовать частный сеттер или установить поле поддержки?
(Но тогда вы должны убедиться, что имя вашего вспомогательного поля может быть определено на основе имени свойства.
Например, убедившись, что ваше вспомогательное поле всегда имеет то же имя, что и имя свойства, но с префиксом подчеркивания; как NHibernate использует свои стратегии доступа).

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