在设置后锁定属性

时间:2012-01-18 21:44:41

标签: c#

我有一个类,有这样的属性:

public class MyClass
{
   private int MyProp { get; set; }

以及使用MyProp的几种方法。一种方法设置它,所有其他方法读取值。我想做的是,一旦设定了价值,就让其它方法无法改变其价值。

感谢您的建议。

5 个答案:

答案 0 :(得分:5)

您可以添加属性值更改时设置的私有字段:

public class MyClass
{
    private bool myPropSet = false;

    private int myProp;
    public int MyProp
    {
        get
        {
            return myProp;
        }
        set
        {
            if (!myPropSet)
            {
                myPropSet = true;
                myProp = value;
            }
        }
    }

答案 1 :(得分:2)

我能想到的最接近的事情就是将它设置为只读,这允许你在构造函数中分配它,然后它就变成了只读。

public class MyClass
{
   private readonly int MyProp { get; set; }

   public MyClass(int prop)
   {
       MyProp = prop; // cannot be modified further
   }
}

答案 2 :(得分:1)

在这种情况下,个人拥有财产公共制定者并非直观。调用者如何知道之前已经调用过setter?如果没有得到get,他们怎么知道setter设置正确?

我更喜欢这样,所以调用者知道该集合是成功的(如果它关心)

public int MyProp { get; private set; }

public bool InitMyProp(int value)
{ 
    if(!_set)
    {
        MyProp = value;
        _set = true;
        return true;
    }
    return false;  
 }

答案 3 :(得分:0)

您可以将其更改为传统属性而不是自动属性,然后验证setter:

public class MyClass
{
    private int _myProp;
    private int MyProp
    {
        get { return _myProp; }
        set 
        {
            if (_myProp == 0)
                _myProp = value
            else
                throw new Exception();
        }
    }
}

答案 4 :(得分:0)

如果您可以在构造函数中设置值,请参阅readonly修饰符。