使用“this”关键字

时间:2017-02-15 20:44:34

标签: c# this

我正在研究this的用法,我想我至少在一定程度上理解它,比如什么时候解决歧义并从“当前”类中调用方法,但是我从书中得到了一个例子。阅读(Head First C#)让我很难过:

public void SpeakTo(Elephant whoToTalkTo, string message) {
    whoToTalkTo.TellMe(message, this);
}

在这种方法中,可以安全地说this具有始终引用调用方法SpeakTo()的任何对象的功能,无论写入哪个类调用?

3 个答案:

答案 0 :(得分:4)

否......实际上,您的上下文中的this是指定义SpeakTo的对象,而不是调用它的对象。

我们这样说吧:

  • 对象speaker属于Speaker类,用于定义SpeakTo 方法,
  • 对象caller正在调用speaker.SpeakTo()
  • 对象whoToTalkTo属于定义TellMe(string, Speaker)
  • 的类

如您所见,whoToTalkTo期待Speaker类实例。然后,speaker对象就是这样,并且可以自由地传递this作为参数。

现在我们可以构建一个更大的例子,让这些关系变得更加明显:

class Speaker
{
    public int Data { get; set; }

    public void SpeakTo(Elephant whoToTalkTo, string message) 
    {
        // Passing current instance of this class as the argument
        whoToTalkTo.TellMe(message, this);
    }
}

这个Speaker类包含一个状态。现在我将使用whoToTalkTo对象来更改该状态:

class Talker
{
    public void TellMe(string message, Speaker speaker)
    {
        speaker.Data = message.Length;
    }
}

此实现正在更改传递给它的一个特定对象的状态。

现在终极调用者来到了图片中,实际上选择了Speaker对象的对象将会受到TellMe()方法的影响:

class Caller
{
    public void DoWork()
    {
        Talker talker = new Talker();

        Speaker one = new Speaker();
        Speaker two = new Speaker();

        // This sets one.Data to length of "something"
        one.SpeakTo(talker, "something");

        // This sets two.Data to length of "else"
        two.SpeakTo(talker, "else");

        Console.WriteLine(one.Data);
        Console.WriteLine(two.Data);
    }
}

此代码将打印值9和4,表示whoToTalkTo实际上已经修改了两个不同对象的状态。

答案 1 :(得分:2)

  

在这种方法中,可以安全地说“this”具有始终引用任何对象调用方法“SpeakTo()”的功能,无论写入哪个类调用?

不。 this 指的是调用SpeakTo的对象。它指的是调用SpeakTo的对象。

我将使用一些代码来澄清这一点

class Foo {
    public static void Main(String[] args) { 
        var foo = new Foo();
        foo.MyMethod();
    }

    public void MyMethod() {
         var bar = new Bar();
         bar.SpeakTo(anElephant, "Hello");
     }
}

class Bar {
    public void SpeakTo(Elephant whoToTalkTo, string message) {
       whoToTalkTo.TellMe(message, this);
    }
}

根据您的陈述,this指的是在main方法中创建的foo变量。这不是的情况。 this实际上是指bar。即方法名称之前的对象。

答案 2 :(得分:0)

this指的是具有方法SpeakTo的类的当前对象。

考虑以下示例:

public class A
{
      public void SpeakTo(Elephant whoToTalkTo, string message) {
          whoToTalkTo.TellMe(message, this);
       }
}

现在,如果您实例化A的对象并调用方法SpeakTo,它将会是:

A obj = new A();
obj.SpeakTo();

在方法SpeakTo中,this指的是当前对象,即obj

方法TellMe的签名应如下所示:

public void TellMe(string message, A objOfA)