属性设置器不更新支持字段

时间:2014-01-12 08:45:20

标签: c# properties

我一直认为属性就像方法的捷径。然而这个例子让我很奇怪。在我看来,函数changePropertyId和changeMethodId也是这样做的。然而现实却不同。只有第二个正常工作。有人可以解释一下吗?

class Program
{
    static void Main(string[] args)
    {
        User user = new User();
        user.changePropertyId(1);
        Console.Write(user.Id);
        user.changeMethodId(1);
        Console.Write(user.Id);
        Console.ReadLine();
    }
}

public class DBObject
{
    private int mId;
    public int Id { set { mId = Id; } get { return mId; } }
    public void setId(int aId)
    {mId = aId;}
}

public class User : DBObject
{
    public void changePropertyId(int aId) { Id = aId; }
    public void changeMethodId(int aId) { setId(aId); }
}

第一个函数的结果是0,第二个函数的结果是1.我的目的是从两个函数得到1。

4 个答案:

答案 0 :(得分:5)

你有一个错误:

set { mId = Id; }

这应该是:

set { mId = value; }

value是您应在商品中使用的新value 二传手。由于这个bug基本上你的setter没有效果。

这是固定版本。

public class DBObject
{
    private int mId;
    public int Id { set { mId = value; } get { return mId; } }
    public void setId(int aId) { mId = aId; }
}

答案 1 :(得分:4)

基本上他们应该在你的样本中做同样的事情。但是,在属性的实现中存在一些错误,您需要更正才能使其正常工作:

public int Id { set { mId = value; } get { return mId; } }

value是属性setter参数的保留名称,其中包含应分配给属性的新值。

答案 2 :(得分:3)

这一行错了:

public int Id { set { mId = Id; } get { return mId; } }

您将当前属性值分配给setter中的后备字段,因此您实际上并未更改该值。那应该是:

public int Id { set { mId = value; } get { return mId; } }

也就是说,如果您不打算向getter或setter添加任何代码以返回支持字段并设置支持字段,那么您应该完全取消支持字段并执行此操作:< / p>

public int Id { get; set; }

请注意,我已经将getter放在setter之前,这是一个普遍的约定,你也应该这样做。

答案 3 :(得分:0)

你的二传手无效:它应该是mId = value;value是setter中使用的特殊变量,包含要设置的值。