【问题标题】:Using "this" - many instances of class, calling private method使用“this” - 类的许多实例,调用私有方法
【发布时间】:2009-10-05 06:59:25
【问题描述】:

我有一个服务器,其中每个连接的客户端都由客户端类的实例表示。这个类负责数据处理。我一直认为,在调用私有函数时,即使同一个类有多个实例,我也不需要使用“this”关键字,因为它也被视为本地调用:

if (data[1]==2 && data [3]==2)
   SendAck();

但是当有更多玩家(更多客户端类)时,有时消息会发送给另一个玩家,并且与其他方法相同。当我将“this”添加到所有方法调用时,一切都很好。是否有可能没有“this”它调用其他类的方法? 谢谢!

EDITL:如何在每个实例中使用公共成员(如公共字典),然后在调用 TryGetValue/ 时不使用此关键字 /like?

【问题讨论】:

  • 1.你可能会调用静态方法吗?
  • 拿走你的'this's并运行一些测试 - 有时行为是否一致且可重复?发生这种行为的地方有什么共同点?
  • 不,这是非常随机且罕见的问题。

标签: c#


【解决方案1】:

不,这是不可能的。 “this”几乎在所有时间都是可选的。如果您有一个方法(例如您的构造函数)采用与您的类的字段同名的参数并且您希望将这些参数的值分配给字段,则您需要它的情况,例如:

class Test
{
    private string strValue;

    public Test(string strValue)
    {
        this.strValue = strValue;
    }
}

我认为您的代码中还有另一个问题。能否请您提供更多详细信息?

【讨论】:

  • 可能是因为有些方法是公开的?
  • 没有。 public / private 限定词与它无关。
  • 对不起,我不能给你更多的细节,它相当复杂的应用程序,当我在一些方法调用中添加这个关键字时,所有的问题都突然停止了。就像执行了来自不同类实例的方法。
  • 您的类中是否有静态成员与实例成员具有相同的名称并且具有相同数量的参数但派生参数类型较少?在这种情况下,没有“this”的调用将调用静态成员。
【解决方案2】:

SendAck();this.SendAck(); 之间没有任何区别,如果该方法是您的类的成员。您将始终从调用该方法的实例调用该方法。

使用调试器检查方法在调用时实际执行的操作。您将看到它是相同的方法,有或没有 this 关键字。

【讨论】:

  • this.SendAck() 可以是扩展方法调用(该特定类的语法糖)
  • 不过,如果当前类中有SendAck 方法,SendAck()this.SendAck() 都会调用 that 方法,因为它优先于扩展方法.
【解决方案3】:

来自 C# 规范:

7.5.7 本次访问


当 this 在一个主表达式中使用时 实例方法或实例访问器 一个类,它被归类为 价值。值的类型是 类的实例类型(§10.3.1) 使用发生的位置,以及 值是对对象的引用 方法或访问器所针对的 调用。

我怀疑您在多线程访问代表已连接客户端的类型实例时遇到问题。

【讨论】:

  • 有线程池所以这应该不是问题。那么公共会员呢
  • 线程池本身的存在并不能保证访问共享状态是安全的。以上摘录适用于所有实例(具有任何可访问性)方法和访问器。
猜你喜欢
  • 2010-09-30
  • 2016-05-26
  • 2017-06-11
  • 2010-09-06
  • 1970-01-01
  • 2022-06-14
  • 2010-11-04
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多