[英]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.