现在的位置: 首页 > 综合 > 正文

C#中base和this关键字

2013年10月24日 ⁄ 综合 ⁄ 共 2239字 ⁄ 字号 评论关闭

   

this:

 

用于引用类的当前实例,也包括继承而来的方法,通常可以隐藏this

MSDN中的小结功能主要包括:

    (1)限定被相似的名称隐藏的成员 

    (2)将对象作为参数传递到其他方法 

    (3)声明索引器 

     this指代类对象本身,用于访问本类的所有常量、字段、属性和方法成员,而且不管访问元素是任何访问级别。因为,this仅仅局限于对象内部,对象外部是无法看到的,这就是this的基本思想。另外,静态成员不是对象的一部分,因此不能在静态方法中引用this

    在C#中,this关键字代表当前实例,我们可以用this.来调用当前实例的成员方法,变量,属性,字段等;

    下面是你这段程序的注解:

	// 引入使命空间System
using System;
	// 声明命名空间CallConstructor
namespace CallConstructor
{
	// 声明类Car
	public class Car
{
	// 在Car类中:
	// 声明一个非静态的整型变量petalCount,初始值为0
	// 未用Static声明的变量叫做静态变量,非静态成员属于
	类的实例,我们只能在调用类的构造函数对类进行实例化后才能通过所得的实例加"."来访问
int petalCount = 0;
	// 声明一个非静态的字符串变量s,初始值为"null";
	// 注意:s = "null"与s = null是不同的
	String s = "null";
	// Car类的默认构造函数
Car(int petals)
{
	// Car类的默认构造函数中为 petalCount 赋值为传入的参数petals的值
	petalCount = petals;
	// 输出petalCount
	Console.WriteLine("Constructor w/int arg only,petalCount = " + petalCount);
}
	// 重载Car类的构造函数
	// : this(petals) 表示从当前类中调用petals变量的值来作为构造函数重载方法Car(String s, int petals)的第二个参数
Car(String s, int petals)
: this(petals)
{
	// 在构造函数中为s赋值
	// 非静态成员可以在构造函数或非静态方法中使用this.来调用或访问,也可以直接打变量的名字,因此这一句等效于s = s,但是这时你会发类的变量s与传入的参数s同名,这里会造成二定义,所以要加个this.表示等号左边的s是当前类自己的变量
	this.s = s;
	Console.WriteLine("String & int args");
}
	// 重载构造函数,: this("hi", 47) 表示调Car(String s, int petals) 这个重载的构造函数,并直接传入变量"hi"和47
Car()
: this("hi", 47)
{
	Console.WriteLine("default constructor");
}
public static void Main()
{
	Car x = new Car();
	Console.Read();
}
}
} 

base:

    用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中。

MSDN中小结的具体功能包括:

      (1)调用基类上已被其他方法重写的方法。 

      (2)指定创建派生类实例时应调用的基类构造函数。

      base常用于,在派生类对象初始化时和基类进行通信。 

      base可以访问基类的公有成员和受保护成员,私有成员是不可访问的。

    在多层继承中,base可以指向的父类的方法有两种情况:一是有重载存在的情况下,base将指向直接继承的父类成员的方法;而没有重载存在的情况下,base可以指向任何上级父类的公有或者受保护方法。 


源码:

 public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Cat cat = new Cat("咪咪");
            MessageBox.Show("我的名字是:" + cat.Myneme());
        }
        class Animal
        {
            protected string name = "";
            protected int shoutNum = 3;
            public Animal(string name)
            {
                this.name = name;
            }            
        }
        class Cat : Animal
        {
            public Cat(string name): base(name)
            { }
            public string Myneme()
            {
                String myneme = name;
                return myneme;
            }
            
        }
    }


通用规则:

1、尽量少用或者不用basethis。除了避开子类的名称冲突和在一个构造函数中调用其他的构造函数之外,basethis的使用容易引起不必要的结果。 

2、在静态成员中使用basethis都是不允许的。原因是,basethis访问的都是类的实例,也就是对象,而静态成员只能由类来访问,不能由对象来访问。 

3base是为了实现多态而设计的。 

4、使用thisbase关键字只能指定一个构造函数,也就是说不可同时将thisbase作用在一个构造函数上。 

5、简单的来说,base用于在派生类中访问重写的基类成员;而this用于访问本类的成员,当然也包括继承而来公有和保护成员。 

6、除了base,访问基类成员的另外一种方式是:显示的类型转换来实现。只是该方法不能为静态方法。

 

抱歉!评论已关闭.