新传递静态计数器并且我被卡住了。我想计算Member()类的实例,然后在将它添加到ObservableCollection时将该值作为成员的Id编号,在这种情况下称为_members。
在我的会员班中:
// Total numbers of instances that have been created
public static int NumMembers { get; protected set; }
// Static constructor initializes NumMembers
static Member()
{
NumMembers = 0;
}
public Member(string img, int mbrnum, string mbrname, string phonenum, string mbradd, List<string> rtls)
{
// Increment member count and assign member number.
NumMembers++;
MemberNumber = NumMembers;
Img = img;
MemberName = mbrname;
MemberPhone = phonenum;
MemberAddress = mbradd;
Rentals = rtls;
} // Working ctor
在我的主窗口中:
_members.Add(new Member()
{
Img = "Default.jpg",
MemberNumber = 0,
MemberName = "Joe Snow",
MemberPhone = "0549880974",
MemberAddress = "Mars",
Rentals = new List<string>()
{
"Mrs. Brown's Boys D'Movie",
"Jersey Boys"
}
});
如果我将会员号码硬编码到主窗口中的任何号码,它会正确显示,所以我知道我在这里做错了什么,但我老实说有点失落了。障碍。我会非常感谢一对比我更有经验的新眼球!
答案 0 :(得分:1)
无论您调用哪个构造函数,首先调用构造函数然后设置属性的事实可能会用0覆盖正确的成员编号。此外,您不是在调用实际递增NumMembers
属性的构造函数,而是调用无参数构造函数。
解决问题的正确方法
将MemberNumber
属性设为只读,并确保仅在构造对象时设置它。这样您就可以防止该属性被其他值意外覆盖。
使其成为无参数构造函数:
public Member()
{
// Increment member count and assign member number.
NumMembers++;
MemberNumber = NumMembers;
}
它增加静态属性并将新成员编号分配给此实例。 这是MemberNumber
属性分配的唯一时间,实际上唯一一次NumMembers
属性可以递增!。
确保从所有其他可用的构造函数:
中调用此构造函数public Member(string img, ...) : this()
{
Img = img;
...
}
请注意 : this()
部分!
声明MemberNumber
属性如下,以确保无法从“outside”更改:
public int MemberNumber
{
get;
private set;
}
答案 1 :(得分:1)
您在带参数的构造函数中递增计数器。但是您实例化Member对象的方式是调用默认/空构造函数,因此您的计数器永远不会更新。 您应该调用您创建的构造函数,或者您应该在默认构造函数中添加构造函数,并且所有后续构造函数也应该调用默认构造函数。
下面我添加了counter int默认构造函数,并使subesquent构造函数调用它
// Total numbers of instances that have been created
public static int NumMembers { get; protected set; }
// Static constructor initializes NumMembers
static Member()
{
NumMembers = 0;
}
public Member()
{
// Increment member count and assign member number.
NumMembers++;
}
public Member(string img, int mbrnum, string mbrname, string phonenum, string mbradd, List<string> rtls)
:this()
{
MemberNumber = NumMembers;
Img = img;
MemberName = mbrname;
MemberPhone = phonenum;
MemberAddress = mbradd;
Rentals = rtls;
} // Working ctor
`
答案 2 :(得分:0)
调用正确的构造函数:
_members.Add(new Member("Default.jpg", 0, "Joe Snow", "0549880974", "Mars",
new List<string>
{
"Mrs. Brown's Boys D'Movie",
"Jersey Boys"
}));
但似乎第二个参数mbrnum
是无用的,因为你在静态成员中处理这个计数器,这是非常不推荐用于线程安全问题的方式(但这不是你的问题)。