Class 数组使用产生错误 "NullReferenceException: Object reference not set to an instance of an object"
Class Array usage generates the error "NullReferenceException: Object reference not set to an instance of an object"
我目前正在为一款名为 Reign of Kings 的游戏开发服务器系统。我正在使用 Oxide 开发人员提供的挂钩和命令来制作我的服务器系统。回到 PAWN 语言,我们可以做一些事情,比如在数组中枚举玩家数据,将其转换为二维数组——这很酷。像 PlayerData[playerid][data] 和 data 可以是任何东西,从一个叫做 pAdminLevel 的整数到一个叫做 pPassword 的字符串。
我知道在 C# 中,情况有所不同。所以我试着复制这样的方法:
pData[] PlayerData = new pData[MAX_PLAYERS];
public class pData
{
private int _admin;
public int admin { get { return _admin; } set { _admin = value; } }
public void ClearInfo()
{
_admin = 0;
}
}
所以基本上每当我想叫玩家的名字时,我都可以使用 PlayerData[playerid].admin.
但我收到错误消息:
5:13 PM [Error] Failed to call hook 'OnPlayerConnected' on plugin 'ServerCommands' (NullReferenceException: Object reference not set to an instance of an object)
经过大量测试后,我绝对确定问题出在我调用 PlayerData[x].admin 和 PlayerData[x].ClearInfo() 的方式上。
您没有初始化新数组的成员。与 C++ 等语言不同,数组的内容是 引用类型 ,因此您的代码相当于创建指针数组并立即尝试使用数组成员的 C++ .
尝试这样的事情:
pData[] PlayerData = new pData[MAX_PLAYERS];
for(int i=0; i < MAX_PLAYERS; i++)
{
PlayerData[i] = new pData();
}
这会在数组的每个元素中放置一个新的 pData
对象,然后您的代码应该会按预期工作。
我目前正在为一款名为 Reign of Kings 的游戏开发服务器系统。我正在使用 Oxide 开发人员提供的挂钩和命令来制作我的服务器系统。回到 PAWN 语言,我们可以做一些事情,比如在数组中枚举玩家数据,将其转换为二维数组——这很酷。像 PlayerData[playerid][data] 和 data 可以是任何东西,从一个叫做 pAdminLevel 的整数到一个叫做 pPassword 的字符串。
我知道在 C# 中,情况有所不同。所以我试着复制这样的方法:
pData[] PlayerData = new pData[MAX_PLAYERS];
public class pData
{
private int _admin;
public int admin { get { return _admin; } set { _admin = value; } }
public void ClearInfo()
{
_admin = 0;
}
}
所以基本上每当我想叫玩家的名字时,我都可以使用 PlayerData[playerid].admin.
但我收到错误消息:
5:13 PM [Error] Failed to call hook 'OnPlayerConnected' on plugin 'ServerCommands' (NullReferenceException: Object reference not set to an instance of an object)
经过大量测试后,我绝对确定问题出在我调用 PlayerData[x].admin 和 PlayerData[x].ClearInfo() 的方式上。
您没有初始化新数组的成员。与 C++ 等语言不同,数组的内容是 引用类型 ,因此您的代码相当于创建指针数组并立即尝试使用数组成员的 C++ .
尝试这样的事情:
pData[] PlayerData = new pData[MAX_PLAYERS];
for(int i=0; i < MAX_PLAYERS; i++)
{
PlayerData[i] = new pData();
}
这会在数组的每个元素中放置一个新的 pData
对象,然后您的代码应该会按预期工作。