我无法添加哈希表

本文关键字:哈希表 添加 | 更新日期: 2023-09-27 18:00:57

首先,对不起我的英语不好。

我有这个:

public static Users server = new Users();
static void Main(string[] args)
{
    server.addNewUser(1, "John");
    server.addNewUser(2, "Marlon");
    server.addNewUser(3, "Lucas");
    Console.WriteLine(server.countUsers()); //COUNT USERS
    TcpManager manager = new TcpManager(58636, 500);
    Console.Read();
}

TcpManager:

public Users test = new Users();
internal TcpManager(int port, int maxuserson)
{
    test.addNewUser(4, "Julio");
    test.addNewUser(5, "Marcelo");
    test.addNewUser(6, "Andre");
    Console.WriteLine(test.countUsers()); //COUNT USERS
}

和我的用户类:

class Users
{
    Hashtable users = new Hashtable();
    public void addNewUser(int id, string name)
    {
        if (!users.ContainsKey(id))
            users.Add(id, name);
        else users[id] = name;
    }
    public int countUsers()
    {
        return users.Count;
    }
}

我的问题是,当我在Main上添加一个用户时,它是有效的!但当我在TcpManager中尝试做同样的操作时,他根本不添加。

如何使其发挥作用?我试过List、Dictionary、Tuple,都有同样的问题。

我的第一个ConsoleWrite返回"3",TcpManager中的第二个也返回"3",什么时候应该返回"6"。

谢谢大家,再次为我的英语感到抱歉。

我无法添加哈希表

您将Users类中的Hashtable声明为实例字段。这意味着CCD_ 2的每个实例都有自己的哈希表。因此,程序的行为正如人们所期望的那样。

有几种方法可以让它按你想要的方式工作。

使Users为静态

static class Users
{
    private static Hashtable users;
    static Users()
    {
       users = new Hashtable();
    }
    public static void addNewUser(int id, string name)
    {
        if (!users.ContainsKey(id))
            users.Add(id, name);
        else users[id] = name;
    }
    public static int countUsers()
    {
        return users.Count;
    }    
}

用法

Users.addNewUser(1, "Vera");
Console.WriteLine(Users.countUsers());

使用用户Hashable static(本质上,这是单状态模式(

class Users
{
    private static Hashtable users = new HashTable();
    public void addNewUser(int id, string name)
    {
        if (!users.ContainsKey(id))
            users.Add(id, name);
        else users[id] = name;
    }
    public int countUsers()
    {
        return users.Count;
    }    
}

用法

var users = new Users();
users .addNewUser(1, "Vera");
Console.WriteLine(users.countUsers());

使用Singleton

class Users
{
    private Hashtable users;
    private static Users instance;
    private Users()
    {
         users = new HashTable();
    }
    public static Users Instance 
    {
        get
        {
            if (instance == null)
                instance=new Users();
            return instance;
        }
    }
    public void addNewUser(int id, string name)
    {
        if (!users.ContainsKey(id))
            users.Add(id, name);
        else users[id] = name;
    }
    public int countUsers()
    {
        return users.Count;
    }    
}

用法

Users.Instance是唯一将被创建的用户实例,因为ctor是私有的,并且只在Instance-属性中使用。

var users = Users.Instance;
users.addNewUser(1, "Vera");
users.countUsers();

尝试这种方式:

TcpManager manager = new TcpManager(58636, 500);
test.addNewUser(4, "Julio");
test.addNewUser(5, "Marcelo");
test.addNewUser(6, "Andre");
Console.WriteLine(manager.test.countUsers()); // 6

在TcpManager构造函数中:

internal TcpManager(int port, int maxuserson)
{
    // This code will executed when you call  new TcpManager();
    // So, you have to add 1, 2 and 3 ids first.
    manager.test.addNewUser(1, "John");
    manager.test.addNewUser(2, "Marlon");
    manager.test.addNewUser(3, "Lucas");
    Console.WriteLine(test.countUsers()); //COUNT USERS: 3
}