【问题标题】:Does `this` inside a class method refer to the called or default instance?类方法中的“this”是指被调用的还是默认的实例?
【发布时间】:2019-10-31 21:47:39
【问题描述】:

在 VBA 中,如果我要修改它们的属性值,我会不断地将类实例作为参数传递给它们自己的方法。举一个极其简化的 C# 示例:

class WhateverClass
{
    public void DoSomething(WhateverClass whateverClass)
    {
        whateverClass.WhateverProperty = "Hello"
    }
}

在 C# 中,我可以避免像这样使用this 将调用的类实例作为参数传递吗?还是this 会引用默认的类实例?

class WhateverClass
{
    public void DoSomething()
    {
        this.WhateverProperty = "Hello"
    }
}

【问题讨论】:

  • 没有“默认类实例”这样的东西。
  • VBA / VB 6(显然是 VB.NET)的概念大致相当于 @RufusL 的具体形式。因此,如果一个表单名为Form1,那么您可以使用Form1 而无需对其进行更新。但它并不适用于表格之外。 这在实践中也是一场噩梦。
  • @mjwills 我完全同意,这就是为什么我对不必要地将调用实例作为参数传递如此挑剔的原因,因为我试图坚定地避免这个问题。
  • 只是为了澄清 VBA / VB6 方面的事情。类/表单是否具有默认实例由属性VB_PredeclaredId 的值决定。对于表单,默认为True,对于其他类,默认为False。但是,可以通过操作导出的代码并重新导入来更改它。
  • @mjwills stateful 默认实例是邪恶的/烦人的。就像 C# 中的 static 状态一样。 VBA 中的默认实例对于实现例如非常有用。工厂方法。明智地使用默认实例是一种工具,就像 C# 中的 static 方法一样。它们是否被误用和滥用并不会剥夺它们的用处!

标签: c#


【解决方案1】:

this指的是被调用的类实例。

我做了以下测试应用来检查:

class Program
{
    static void Main()
    {
        var class1 = new Class1();
        class1.Setup();

        Console.Write(class1.Property1);
        Console.ReadKey();
    }
}


class Class1
{
    public string Property1 { get; set;}

    public Class1 ()
    {
        this.Property1 = "Overwrite me";
    }


    public void Setup()
    {
        this.Property1 = "Successfully overwritten";
    }
}

这个的输出是“成功覆盖”

【讨论】:

  • 有点迂腐 --- 你说calling class instance 但这是called class instanceProgram 将是调用class1 上的方法的调用类,这是Class1 类型的被调用类实例。
  • @this 感谢您帮助我收紧!我绝对希望能够有效地传达这两个概念。
【解决方案2】:

它指的是实例,方法被调用。

DoSomething 是非静态的,因此必须在实例上调用它。

一个有趣的例子是扩展方法中使用的“this”。扩展方法只是静态函数的语法糖,必须在类实例上调用。在这种情况下,它正在注释第一个参数,它将自动成为调用它的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2011-05-03
    • 1970-01-01
    • 2013-03-16
    • 2011-04-28
    • 2014-03-12
    • 2020-05-20
    相关资源
    最近更新 更多