MSDN中的定义:引用,类的当前实例.或者是说对类的当前实例的引用,这样可能更顺口一些,而这里的类就是指包含关键字this的那个类.
之所以把this关键字放在类这个分类里面,是因为this只能在类的内部使用,使用他能访问类实例对象内部任何级别(不同类型的访问修饰符)的任何元素(字段,属性,方法等),但静态的类型的成员不能访问,因为静态成员不属于对象的一部分。MSDN里面是这样介绍this关键字的:用来引用类的当前实例。这句话说的很精简,我觉得重点是“当前实例”这四个字,下面我说说我个人的理解。
大家都知道类的定义只是描述了一种数据结构,或者说一种自定义的数据类型,并不能那来直接使用,需要实例化成对象。一个类可以实例化成很多对象,每个对象都是不同的实体(个人觉得这些对象最大的不同就是字段里面所包含的数据的不同),对this的理解可以转换成对一个类不同实例对象的理解,下面我给出具体的演示代码。
除了上面说的this还有另外两种用法,这两种用法也都是基于对上面的理解。一是用来区分当方法参数和数据成员同名时的情况。具体的看上面例子中有注释的那一行。二是把对象作为参数传递到其他的地方。如:ohter(this);这other一般应该是类的内部或其他类定义的方法。
对于this做为声明索引器的用法在这里先不说(PS:我也还没学)。
之所以把this关键字放在类这个分类里面,是因为this只能在类的内部使用,使用他能访问类实例对象内部任何级别(不同类型的访问修饰符)的任何元素(字段,属性,方法等),但静态的类型的成员不能访问,因为静态成员不属于对象的一部分。MSDN里面是这样介绍this关键字的:用来引用类的当前实例。这句话说的很精简,我觉得重点是“当前实例”这四个字,下面我说说我个人的理解。
大家都知道类的定义只是描述了一种数据结构,或者说一种自定义的数据类型,并不能那来直接使用,需要实例化成对象。一个类可以实例化成很多对象,每个对象都是不同的实体(个人觉得这些对象最大的不同就是字段里面所包含的数据的不同),对this的理解可以转换成对一个类不同实例对象的理解,下面我给出具体的演示代码。
class A
{
int i;
public A(int i)
{
this.i = i; //注意这里的用法,在后面我会解释
}
public void displayI()
{
Console.WriteLine(this.i.ToString());
}
}
class RUN
{
static void Main()
{
A a1 = new A(1);
A a2 = new A(2);
a1.displayI();
a2.displayI();
}
}
这个例子我想应该很能说明什么是对类的当前实例(对象)的引用了。类A的成员方法displayI的作用是现实成员属性的值,那么this就会根据是那个对象调用了displayI()而显示调用对象的i的值。{
int i;
public A(int i)
{
this.i = i; //注意这里的用法,在后面我会解释
}
public void displayI()
{
Console.WriteLine(this.i.ToString());
}
}
class RUN
{
static void Main()
{
A a1 = new A(1);
A a2 = new A(2);
a1.displayI();
a2.displayI();
}
}
除了上面说的this还有另外两种用法,这两种用法也都是基于对上面的理解。一是用来区分当方法参数和数据成员同名时的情况。具体的看上面例子中有注释的那一行。二是把对象作为参数传递到其他的地方。如:ohter(this);这other一般应该是类的内部或其他类定义的方法。
public class Vistor
{
string i = "Vistor";
public void Visit(Element e)
{
Console.WriteLine("I was {0}.", e.GetType());
Console.WriteLine("I was {0}.", this.i);
}
}
public class Element
{
string i = "Element";
public void Accept(Vistor v)
{
v.Visit(this);//把对象自身同过Visit方法传出去
}
}
class RUN
{
static void Main()
{
Vistor v = new Vistor();
Element e = new Element();
e.Accept(v);
}
}
这段代码有点绕(来至张逸:晴窗笔记做了部分改动),大家可以想行为什么会是那样的结果。{
string i = "Vistor";
public void Visit(Element e)
{
Console.WriteLine("I was {0}.", e.GetType());
Console.WriteLine("I was {0}.", this.i);
}
}
public class Element
{
string i = "Element";
public void Accept(Vistor v)
{
v.Visit(this);//把对象自身同过Visit方法传出去
}
}
class RUN
{
static void Main()
{
Vistor v = new Vistor();
Element e = new Element();
e.Accept(v);
}
}
对于this做为声明索引器的用法在这里先不说(PS:我也还没学)。