2014-01-12 61 views
0

我一直認爲屬性就像方法的快捷方式。然而這個例子讓我很奇怪。在我看來,函數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

基本上他們應該在你的樣本中做同樣的事情。然而,在屬性的實現一個小錯誤,需要更正,使其工作:

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

value是包含應分配給新的價值屬性setter的參數保留名稱財產。

5

您在這裏有一個BUG:

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; } 
} 
0

您的二傳手無效:應該是mId = value;value是包含要設置的值的setter中使用的特殊變量。

3

此行是錯誤的:

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

你在二傳手分配當前屬性值,以支持字段這樣你就不會真正改變的值。這應該閱讀:

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

這就是說,如果你不打算給任何代碼添加到getter或setter除此之外返回後備字段,並設置支持字段,那麼你應該與後盾做掉場乾脆只是這樣做:

public int Id { get; set; } 

注意那裏,我已經把吸氣劑setter,它是一種通用的慣例和東西,你應該做的太多了。