如何使用通用getter和setter设置只读属性的值?

时间:2009-02-19 12:28:01

标签: c# properties

不确定我是否正确说明了这一点......但我有以下代码:

    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 个答案:

答案 0 :(得分:32)

我会这样做:

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

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

当然,在本课程中设置它是开放的,但是既然你正在编写它,我希望你有理由不打破你自己的意图......

在我看来,从外面看,像readonly属性这样的东西最重要。从内到外,它并不重要,因为那里,你是国王=)

答案 1 :(得分:4)

如果您只需要ItemId属性对您班级的外部用户是只读的,那么Svish的回答是可行的方法。

如果您需要ItemId在课堂内只读,那么您需要执行以下操作:

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

public TransactionItem()
{
    _ItemId = Guid.Empty;
}

答案 2 :(得分:2)

您可以使用readonly关键字

public readonly Guid ItemId;

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

答案 3 :(得分:2)

我担心你的问题不是很明确 - 但是如果没有定义属性设置器,那么你当然不能称之为。

在自动实现的只读属性之后,你实际上是,允许在构造函数中进行设置吗?如果是这样的话,我恐怕没有,就像我喜欢的那样。

为了扩展我的意思,我喜欢能够做到:

// 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!";
    }
}

基本上它会“使一个属性像一个只读字段。”

答案 4 :(得分:0)

使用私人设定者,或设置支持字段?
(但是,您必须确保可以根据属性名称确定支持字段的名称 例如,确保您的支持字段始终与property-name具有相同的名称,但前缀为下划线;就像NHibernate使用其访问策略一样。