C#静态计数器没有递增 - 为什么?

时间:2014-12-18 10:02:38

标签: c# static

新传递静态计数器并且我被卡住了。我想计算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"
            }
        });

如果我将会员号码硬编码到主窗口中的任何号码,它会正确显示,所以我知道我在这里做错了什么,但我老实说有点失落了。障碍。我会非常感谢一对比我更有经验的新眼球!

3 个答案:

答案 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是无用的,因为你在静态成员中处理这个计数器,这是非常不推荐用于线程安全问题的方式(但这不是你的问题)。