我目前正在修改一个服务器,这是另一个人写的。我现在需要将非静态方法转换为静态方法。一切都很完美,但方法内的这行代码:
var buOwner = SocketServer.GetClientByPlayerId(buUserId);
if (buChatProjectId == SocketServer.ChatProjectID.ToString() && buOwner != null && buOwner.Character.name == buUsername && buChatSessionId == buOwner.index.ToString() && ((byte)buOwner.Character.Faction).ToString() == buFaction)
{
buOwner.Chat = this;
}
由于 'this':
引发错误error CS0026: Keyword 'this' is not valid in a static property, static method, or static field initializer
当我删除这行代码时,一切正常,我可以将该方法转换为静态方法。唯一的缺点是,这条线似乎正在做一些非常重要的事情,因为当我删除它时,服务器不再按预期工作(不再执行所有方法等等),问题是,我真的有不知道
buOwner.Chat = this;
线在做什么。
我知道信息如此之少很难解决我的问题,但我唯一需要知道的是独立的 'this' 做了什么(或可能做什么),因为我只见过它与某些东西(例如
this.name
)或作为扩展方法,例如:public static int Foo(this MyClass arg)
如果我能理解 'this' 在这一行中可以做什么,我应该能够弄清楚如何通过将 'this' 与其他做同样事情的东西交换来解决我的问题。
因此,如果你们中的任何人之前像这样使用过'this'(嘿,很好xD),并且可以告诉我它在这样的用例中的作用,我将永远感激不已。
一些进一步的背景信息代码:
我要转换为静态的方法
public static void OnMessage(string message)
{
var parsedMessage = message.Split('%');
var messageProtocol = parsedMessage[0];
var roomId = int.Parse(parsedMessage[1]);
Logger.Add("Server received message protocol: >" + messageProtocol + "<", "CDebug");
switch (messageProtocol)
{
case "bu": // Login Request
Logger.Add("Server received Login Request: " + " Protocol: " + messageProtocol + " | RoomID: " + roomId, "CDebug");
var buParsedBody = parsedMessage[2].Split('@');
var buUsername = buParsedBody[0];
var buUserId = buParsedBody[1];
var buChatSessionId = buParsedBody[2];
var buChatProjectId = buParsedBody[3];
var buChatLanguage = buParsedBody[4];
var buClan = buParsedBody[5];
var buFaction = buParsedBody[8];
var buOwner = SocketServer.GetClientByPlayerId(buUserId);
if (buChatProjectId == SocketServer.ChatProjectID.ToString() && buOwner != null && buOwner.Character.name == buUsername && buChatSessionId == buOwner.index.ToString() && ((byte)buOwner.Character.Faction).ToString() == buFaction)
{
buOwner.Chat = this;
}
buOwner引用的方法(通过UserId返回客户端)
public static Client GetClientByPlayerId(string id)
{
var clients = Clients;
foreach (var currClient in clients)
{
var client = currClient.Value;
if (client.playerId == uint.Parse(id))
return client;
}
return null;
}
我的主要想法是:
SocketServer.GetClientByPlayerId(buUserId)
| 的结果不,因为那是 buOwner,我已经尝试过public static void OnMessage(string message)
并且没有意义/帮助This 指的是它所使用的类的实例。因此,如果您在苹果类中,这将指的是苹果的该实例。
某些东西不起作用的原因是因为您处于静态方法中,这没有意义,因为您不在实例化对象中。