繁体   English   中英

属性设置器不会更新后备字段

[英]Property setter doesn't update the backing field

我一直认为属性就像方法的捷径。 但是这个例子让我很奇怪。 在我看来,函数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。

您在这里有一个错误:

set { mId = Id; }

内容应为:

set { mId = value; }

value是您应该在属性中使用的新value
二传手。 由于这个错误,您的安装程序基本上没有作用。

这是固定版本。

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

基本上,它们应该在您的样本中执行相同的操作。 但是,该属性的实现中存在一些错误,您需要对其进行更正以使其起作用:

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

value是属性设置器参数的保留名称,该参数包含应分配给属性的新值。

这行是错误的:

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

您正在将当前属性值分配给setter的后备字段,因此您实际上并未更改该值。 内容应为:

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

就是说,如果您不打算向getter或setter之外添加任何代码以返回支持字段并设置支持字段,那么您应该完全取消支持字段,只需执行以下操作:

public int Id { get; set; }

请注意,我已经将getter放在setter之前,这是一个通用约定,您也应该这样做。

您的设置器无效:应为mId = value; value是在setter中使用的特殊变量,其中包含要设置的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM