完全独立的“this”的目的是什么?

问题描述 投票:0回答:1

我目前正在修改一个服务器,这是另一个人写的。我现在需要将非静态方法转换为静态方法。一切都很完美,但方法内的这行代码:

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;
        }

我的主要想法是:

  • 也许这只是反映了等号另一边的内容 |不,当我用 buOwner.Chat 替换 'this' 时,服务器仍然无法正常运行
  • 也许它引用了 if 语句中写入的内容 |没有多大意义
  • 也许它代表“buOwner” |不,当我用 buOwner 替换 'this' 时,它会抛出一个完全不相关的错误
  • 也许它引用了
    SocketServer.GetClientByPlayerId(buUserId)
    | 的结果不,因为那是 buOwner,我已经尝试过
  • 也许它引用了方法 |不,那将是
    public static void OnMessage(string message)
    并且没有意义/帮助
c# asp.net this
1个回答
0
投票

This 指的是它所使用的类的实例。因此,如果您在苹果类中,这将指的是苹果的该实例。

某些东西不起作用的原因是因为您处于静态方法中,这没有意义,因为您不在实例化对象中。

© www.soinside.com 2019 - 2024. All rights reserved.