我一直认为属性就像方法的捷径。然而这个例子让我很奇怪。在我看来,函数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。
答案 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中使用的特殊变量,包含要设置的值。