class Person
{
string name;
public Person(string name)
{
this.name = name;
}
public void method()
{
Person gupta = new Person("James"); // Current Object
Console.WriteLine(this.name);
Person gupta1 = new Person("Peter"); // Current Object
Console.WriteLine(this.name);
Person gupta2 = new Person("Frank"); // Current Object
Console.WriteLine(this.name);
}
static void Main(string[] args)
{
Person p = new Person("Jim");
p.method();
Console.ReadLine();
}
}
此代码生成结果
Jim
Jim
Jim
但是如果认为这应该是
James
Peter
Frank
有人可以解释一下吗?
答案 0 :(得分:7)
this
指的是当前实例。在Main方法中,您创建Person类的实例,并将Jim
传递给构造函数,然后将其存储在name
字段中。接下来,您将调用该方法。在此方法中,您要创建Person
类的多个实例:gupta
,gupta1
和gupta2
。您需要在每个实例上调用name
字段:
public void method()
{
Person gupta = new Person("James");
Console.WriteLine(gupta.name);
Person gupta1 = new Person("Peter");
Console.WriteLine(gupta1.name);
Person gupta2 = new Person("Frank");
Console.WriteLine(gupta2.name);
}
答案 1 :(得分:3)
您正在使用this
。它指的是您当前所在的对象实例。更改以下代码,您将得到您期望的结果。
Person gupta = new Person("James");
Console.WriteLine(gupta.name);
Person gupta1 = new Person("Peter");
Console.WriteLine(gupta1.name);
Person gupta2 = new Person("Frank");
Console.WriteLine(gupta2.name);
答案 2 :(得分:3)
“当前对象”是一种非正式的说话方式。只要你不对它的含义感到困惑就可以了。
不要将它视为一种“按时间顺序”的衡量标准 - “当前对象”不是您最后实例化的对象。相反,它是您调用方法当前执行的类的实例。
在撰写“this。(...)”时,你不知道它将是哪个实例。您现在将代码调用。
Person somePerson = new Person("Lucy");
somePerson.method();
在对method
的调用中,“this”将是Lucy - 因为方法method
正在该特定的Person实例上调用。您在Person
内创建的小method
根本不会影响这一点。
进一步澄清:
Person somePerson = new Person("Lucy");
somePerson.method(); // inside method, "this" is Lucy.
Person somePerson = new Person("Anne");
somePerson.method(); // inside method, "this" is Anne.
Person somePerson = new Person("Sarah");
somePerson.method(); // inside method, "this" is Sarah.
Person somePerson = new Person("Emily");
somePerson.method(); // inside method, "this" is Emily.
答案 3 :(得分:3)
@Nadeem
通过调用main方法启动程序,这将创建一个名为“Jim”的新Person,变量p指向它。
Person p = new Person("Jim");
然后致电
p.method();
因此从p内部调用method()。方法'method()'生成3个新的Person对象,名称为“James”,“Peter”和“Frank”,但“当前范围”仍为p。您正在 p。
中运行'method()'所以如果你问'你的名字是什么?',p会说'吉姆'。
当我在学习的时候,我有时会觉得这样更容易想到 - 如果我有三个孩子然后你问我每个孩子出生后我的名字是什么,我的名字仍然是5arx。你不是问我的孩子他们的名字是什么,你问我。
您可以修改代码以使事情更清晰(也许!):
//Using declarations ommitted for brevity.
public class Person{
public Guid ID;
public string Name;
public Person (string _name){
this.Name = _name;
ID = System.Guid.NewGuid();//creates a unique identifier
}
public void testMethod(){
Console.WriteLine("This code is running inside a Person object: " + this.Identify());
Person g1, g2, g3;
g1 = new Person("Nadeem");
g2 = new Person("Anish");
g3 = new Person("Frank");
this.Identify();// this tells you which class the code is running in - ie. what 'this' means in this context.
//These are the additional objects you created by running testmethod from inside "Jim", the first person you created.
g1.Identify();
g2.Identify();
g3.Identify();
//If you want to get really funky, you can call testMethod() on g1, g2 and g3 too.
//the ID field should help you see what's going on internally.
}
public void Identify(){
Console.WriteLine("Person: ID=" + this.ID + "Name = " + this.Name);//Use string.format in production code!
}
public static void main (string[] args){
Person p = new Person ("Jim");
p.testMethod();
}
}
希望这有帮助,
5arx
答案 4 :(得分:2)
致电时
Person p = new Person("Jim");
p.method();
方法()正在'p'对象上执行...这是你的'当前'对象。也许这是一个糟糕的选择。
'当前'引用'调用该方法的对象'并不意味着'最后使用过的对象'
答案 5 :(得分:2)
如果您将代码重写为:
,也许public void method()
{
Console.WriteLine(this.name);
}
static void Main(string[] args)
{
Person p = new Person("James"); // Current Object
p.method();
Person p2 = new Person("Peter"); // Current Object
p2.method();
Person p3 = new Person("Frank"); // Current Object
p3.method();
Console.ReadLine();
}
你会更好地理解“这个”是如何运作的。
答案 6 :(得分:1)
当您使用this.name
时,您正在寻址对象本身而不是您创建的新对象。 (注意你曾三次使用this.name
并获得三个“吉姆”)。
因此,如果您要打印刚创建的人的姓名,请使用gupta.name
作为第一个和gupta1.name
等。
其他选项是保留List<Person>
并使用foreach
在列表中运行并打印名称。
请注意,有许多Person
可以在同一个应用中共存。并且person对象可以包含其他person
个对象。当你在一个person
的函数内(这里是jim中的一个函数)时,this.name
将只引用他(对jim),而不引用Jim内的其他person
实例!
class Person
{
public string Name
{
get;
protected set;
}
List<Person> Relatives
{
get;
set;
}
public Person(string name)
{
this.Name = name;
Relatives = new List<Person>();
}
public void AddRelative(Person Relative)
{
Relatives.Add(Relative);
}
public void PrintRelatives()
{
foreach (Person Relative in Relatives)
{
Console.WriteLine(Relative.Name);
}
}
static void Main(string[] args)
{
Person jim = new Person("Jim");
jim.AddRelative(new Person("James"));
jim.AddRelative(new Person("Peter"));
jim.AddRelative(new Person("Frank"));
jim.PrintRelatives();
Console.ReadLine();
}
}