Base关键字用途
用于从派生类中访问基类的成员,调用基类上已被其他方法重写的方法。
指定创建派生类实时应调用的基类构造函数。
基类访问只能在构造函数,实例方法或实例属性访问器中进行。
从静态方法中使用 base 关键字是错误的。
Base 主要用于面向对象开发的对态这方面。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 {class Program {//base的用法//1. 访问基类成员,访问基类方法public class BaseClass {protected string _calssName = "BaseClass";public virtual void PrintName() {Console.WriteLine("The BaseClass Name is : {0}", _calssName); } }class DerivedClass : BaseClass {public string _className = "DerivedClass";public override void PrintName() {//Console.WriteLine("The BaseClass Name is {0}");//调用基类方法base.PrintName();Console.WriteLine("This DerivedClass is {0}",_className); } }//2. 在派生类中调用基类构造函数public class BaseClass2 {int num;public BaseClass2() {Console.WriteLine("in BaseClass2()"); }public BaseClass2(int i) {num = i;Console.WriteLine("in BaseClass2({0})",num); } }public class DerivedClass2 : BaseClass2 {// 该构造器调用 BaseClass2.BaseClass2() public DerivedClass2(): base() { }// 该构造器调用 BaseClass2.BaseClass2(int i) public DerivedClass2(int i): base(i) { } }static void Main(string [] args) {//访问基类成员,访问基类方法 DerivedClass dc = new DerivedClass();dc.PrintName();//在派生类中调用基类构造函数DerivedClass2 dc2 = new DerivedClass2();DerivedClass2 dc2_b = new DerivedClass2(2);Console.ReadLine(); } } }
控制台输出:
The BaseClass Name is BaseClass
This DerivedClass is DerivedClass
in BaseClass2()
in BaseClass2(1)
this的常用用途:
限定被相似的名称隐藏的成员
将对象作为参数传递到其他方法
声明索引器, 索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。
由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有 this 指针。在静态方法中引用 this 是错误的。
this 关键字引用类的当前实例。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 {class Program {//this的用法//static void Main(string [] args)//{// Console.ReadLine();//} }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(string [] args) {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
通用规则:
1、尽量少用或者不用base和this。除了避开子类的名称冲突和在一个构造函数中调用其他的构造函数之外,base和this的使用容易引起不必要的结果。
2、在静态成员中使用base和this都是不允许的。原因是,base和this访问的都是类的实例,也就是对象,而静态成员只能由类来访问,不能由对象来访问。
3、base是为了实现多态而设计的。
4、使用this或base关键字只能指定一个构造函数,也就是说不可同时将this和base作用在一个构造函数上。
5、简单的来说,base用于在派生类中访问重写的基类成员;而this用于访问本类的成员,当然也包括继承而来公有和保护成员。
6、除了base,访问基类成员的另外一种方式是:显示的类型转换来实现。只是该方法不能为静态方法。
参考:
http://dev.yesky.com/380/7670880_2.shtml
http://www.cnblogs.com/netlyf/archive/2009/09/13/1565709.html
转载于:https://blog.51cto.com/57388/1651664