C#关键字this和base比较
关于使用到了两个C#关键字this和base。
1,C# "this" keyword
其作用引用类的当前实例,其实看了下面这个例子就好理解了。 THIS不能用于静态方法中.比如Main~
主要三个作用:当前实例、参数传递和索引器
1.1 当前实例
class Team
{
///成员变量
private string name;
///构造函数
public Team(string name)
{
this.name = name;
}
}
在这里因为是要将参数的name值传入Team类或者说对象的name成员变量中.
在这里通过使用this可以表明name的对象是当前的实例,也就是Team对象,而不是参数name.
1.2 参数传递
另外还有一个作用就是可以做为'指针'来使用,可以将当前对象元素按照引用参数方式传递。
例如:
class A
{
public string name = "liangzhen";
public A(){
}
}
class B
{
private A a;
public void B(A a)
{
this.a = a;
}
public void Change()
{
this.a.name ="kathy";
}
}
class Demo
{
static void Main()
{
A a = new A();
B b = b(a);
b.Change();
}
}
这里完成的是一个引用参数传递,在这里如果B对象中执行Change方法后,B和A所对于得实例中的name都将改变为"kathy".
3,索引器
最简单的知识,不多说了看一个例子
public object this [int param]
{
get { return array[param]; }
set { array[param] = value; }
}
2,C# "base" keyword
base其实最大的使用地方在面相对性开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法。
例如,
关于base调用基类构造函数
public class A
{
public A()
{
Console.WriteLine("Build A");
}
}
public class B:A
{
public B():base()
{
Console.WriteLine("Build B");
}
}
如果创建一个B的实例对象,获得结果将是同时打印Build A和Build B.
关于base在派生类中调用基类的方法。
public class A
{
public virtual void Hello()
{
Console.WirteLine("Hello");
}
}
public class B : A
{
public override void Hello()
{a
base.Hello();//调用基类的方法,显示Hello
Console.WirteLine("World");
}
}
这样如果程序调用B.Hello()获得的效果将会使Hello World.
最后补充下,根据MSDN Library介绍来看这两个关键字都是属于[访问关键字]类型
base
base 关键字用于从派生类中访问基类的成员:
调用基类上已被其他方法重写的方法。
指定创建派生类实例时应调用的基类构造函数。
基类访问只能在构造函数、实例方法或实例属性访问器中进行。
示例:
在派生类中调用基类方法。
// base 关键字
// 访问基类成员
using System;
public class BaseClass
{
protected string _className = "BaseClass";
public virtual void PrintName()
{
Console.WriteLine("Class Name: {0}", _className);
}
}
class DerivedClass : BaseClass
{
public string _className = "DerivedClass";
public override void PrintName()
{
Console.Write("The BaseClass Name is {0}");
//调用基类方法
base.PrintName();
Console.WriteLine("This DerivedClass is {0}", _className);
}
}
class TestApp
{
public static void Main()
{
DerivedClass dc = new DerivedClass();
dc.PrintName();
}
}
/**//*
控制台输出:
The BaseClass Name is BaseClass
This DerivedClass is DerivedClass
*/
在派生类中调用基类构造函数。
// keywords_base2.cs
using System;
public class BaseClass
{
int num;
public BaseClass()
{
Console.WriteLine("in BaseClass()");
}
public BaseClass(int i)
{
num = i;
Console.WriteLine("in BaseClass(int {0})", num);
}
}
public class DerivedClass : BaseClass
{
// 该构造器调用 BaseClass.BaseClass()
public DerivedClass() : base()
{
}
// 该构造器调用 BaseClass.BaseClass(int i)
public DerivedClass(int i) : base(i)
{
}
static void Main()
{
DerivedClass dc = new DerivedClass();
DerivedClass dc1 = new DerivedClass(1);
}
}
/**//*
控制台输出:
in BaseClass()
in BaseClass(1)
*/
注意点
从静态方法中使用 base 关键字是错误的。
base 主要用于面向对象开发的对态这方面,在示例2中有体现。
this
this 关键字引用类的当前实例。
以下是 this 的常用用途:
限定被相似的名称隐藏的成员
将对象作为参数传递到其他方法
声明索引器
示例:
综合示例。
// this 关键字
// keywords_this.cs
using System;
class Employee
{
private string _name;
private int _age;
private string[] _arr = new string[5];
public Employee(string name, int age)
{
// 使用this限定字段,name与age
this._name = name;
this._age = age;
}
public string Name
{
get { return this._name; }
}
public int Age
{
get { return this._age; }
}
// 打印雇员资料
public void PrintEmployee()
{
// 将Employee对象作为参数传递到DoPrint方法
Print.DoPrint(this);
}
// 声明索引器
public string this[int param]
{
get { return _arr[param]; }
set { _arr[param] = value; }
}
}
class Print
{
public static void DoPrint(Employee e)
{
Console.WriteLine("Name: {0}\nAge: {1}", e.Name, e.Age);
}
}
class TestApp
{
static void Main()
{
Employee E = new Employee("Hunts", 21);
E[0] = "Scott";
E[1] = "Leigh";
E[4] = "Kiwis";
E.PrintEmployee();
for(int i=0; i<5; i++)
{
Console.WriteLine("Friends Name: {0}", E[i]);
}
Console.ReadLine();
}
}
/**//*
控制台输出:
Name: Hunts
Age: 21
Friends Name: Scott
Friends Name: Leigh
Friends Name:
Friends Name:
Friends Name: Kiwis
*/
本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/13708.htm