访问关键字 this & base
总结:
this: 为当前类下的实例化对象 。
base: 为调用基类的成员。
注意:
都不能在静态方法中调用 this 或 base 关键字。
1. this 关键字
- (1) 限定相似名称成员
C# 中使用 this 关键字可以实现对当前类的实例化对象进行引用,从而直接在编辑类的同时简化使用该类实例化成员。比如:
class Employee
{
private string name;
private string alias;
private decimal salary = 3000.00m;
public Employee(string name, string alias)
{
this.name = name;
this.alias = alias;
}
}
在 Employee 类中的<构造函数> public Employee(string name, string alias)
通过使用this.name=name 将<实例化类的参数 name> 传递给该<实例化对象的字段 name>。而不需要先实例化 Employee 对象,再通过 myEmployee.name=newname 来定义其字段。
所以,使用this关键字的第一好处就是可以直接在定义类成员的同时指定其与其他类成员的关系,在上例就是指定<构造函数参数name>和<字段name>的关系。所以,该使用方法也叫做——To qualify members hidden by similar names,限定相似名称成员。
当然其也可以应用在类成员中,如何某一个<方法>。
- (2) 将对象作为参数传递给方法
public void printEmployee()
{
Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this));
}
其中 this 代表了实例化对象,将当前对象传递给其他类 Tax 的方法CalcTax() ,在 Tax 类中可以直接使用 this 代替其类的实例化对象,也就是说,可以使用 this.salary 访问其字段 salary。
- (3) 集合 索引符
public Animal this[int animalIndex]
{
get { return (Animal)List[animalIndex]; }
set { List[animalIndex] = value; }
}
this 也常用为集合中的<索引符>,以上代码中this要和 [int param] 索引参数共同使用, 返回对象指定了类型Animal,因为IList.List返回System.Object对象,这一般用于CollectionBase类的集合。
2. base 关键字
- (1) base 关键字用于从派生类中访问基类的成员,例如在<派生类>中调用<基类方法>。
public class Person
{
protected string name = "John L. Malgraine";
public virtual void GetInfo()
{
Console.WriteLine("Name: {0}", name);
}
}
class Employee : Person
{
public string id = "ABC567EFG";
public override void GetInfo()
{
base.GetInfo();
Console.WriteLine("Employee ID: {0}", id);
}
}
class TestClass
{
static void Main()
{
Employee E = new Employee();
E.GetInfo();
}
}
/*
Output
Name: John L. Malgraine
Employee ID: ABC567EFG
*/
- (2) 在<派生类构造函数>中调用<基类构造函数>
public class BaseClass
{
int num;
public BaseClass()
{
Console.WriteLine("in BaseClass()");
}
public BaseClass(int i)
{
num = i;
Console.WriteLine("in BaseClass(int i)");
}
public int GetNum()
{
return num;
}
}
public class DerivedClass : BaseClass
{
// This constructor will call BaseClass.BaseClass()
public DerivedClass() : base()
{
}
// This constructor will call BaseClass.BaseClass(int i)
public DerivedClass(int i) : base(i)
{
}
static void Main()
{
DerivedClass md = new DerivedClass();
DerivedClass md1 = new DerivedClass(1);
}
}
/*
Output:
in BaseClass()
in BaseClass(int i)
*/
MSDN有关信息
若有其他疑问,请查阅:https://social.msdn.microsoft.com/search/en-US 结合实际内容。