20. C# -- Base, this 关键字

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

时间: 2025-01-08 21:49:37

20. C# -- Base, this 关键字的相关文章

算法导论 第20章 斐波那契堆

一.概念 1.斐波那契堆 斐波那契堆是可合并堆 在不涉及删除的操作(除去EXTRACT和DELETE)中,操作仅需O(1)的平摊运行时间 当EXTRACT和DELETE的操作数目较小时斐波那契堆能得到较好的运行效率. 斐波那契堆不能有效地支持SEARCH操作 用于解决诸如最小生成树和寻找单源最短路径等问题的快速算法都要用到斐波那契堆. 2.斐波那契堆的结构 斐波那契堆由一组最小堆构成,这些最小堆是有根的无序树. 结点结构: key: 关键字,作为排序.判断结点大小的标准 left, right:

.net面试问答(大汇总)

原文://http://blog.csdn.net/wenyan07/article/details/41541489 用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答: 从下至上分别为:数据访问层.业务逻辑层(又或成为领域层).表示层 数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问 业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关 表示层:是系统的UI部分,负责使用者与整个系统的交互.  优点:  分工明确,条理清晰,易

C#面试题汇总【转】

http://www.cnblogs.com/wangjisi/archive/2010/06/14/1758347.html 用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答: 从下至上分别为:数据访问层.业务逻辑层(又或成为领域层).表示层 数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问 业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关 表示层:是系统的UI部分,负责使用者与整个系统的交互.  优点:  分工明确,条理

c++:静态数据成员

一 . 静态数据成员 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其它数据成员一样,静态数据成员也遵守public/protected/private访问规则.同时,静态成员还具有以下特点: 1. 静态数据成员的定义. 静态数据成员实际上是类域中的全局变量.所以,静态数据成员的定义不应该被放在头文件中.静态数据成员初始化时不受private和protected访问限制. 注意:不要试图在头文件中定义静态数据成员.在大多数情况下,这样做会引起重复定义这样

Tcpdump用法

1.监听所有非echo requests/replies的ICMP数据包 //ICMP ECHO(Type 8) 和ECHO Reply (Type 0) #tcpdump "icmp[0] != 8 and icmp[0] != 0" 2.监听非本地网络的每次TCP会话开始和结束数据包 #tcpdump 'tcp[13] & 3 != 0 and not src and dst net localnet' 3.监听网关snup上长度大于576字节的IP数据包 #tcpdump

.NET面试经典问答

用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答:从下至上分别为:数据访问层.业务逻辑层(又或成为领域层).表示层 数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问 业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关 表示层:是系统的UI部分,负责使用者与整个系统的交互.  优点:  分工明确,条理清晰,易于调试,而且具有可扩展性. 缺点:  增加成本. 分层式结构究竟其优势何在? 1.开发人员可以只关注整个结构中的其中某一层

八大排序算法总结及C/C++实现

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1. 插入排序-直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到

学习日记-----各种问题

用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答: 从下至上分别为:数据访问层.业务逻辑层(又或成为领域层).表示层 数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问 业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关 表示层:是系统的UI部分,负责使用者与整个系统的交互.  优点:  分工明确,条理清晰,易于调试,而且具有可扩展性. 缺点:  增加成本. 分层式结构究竟其优势何在? 1.开发人员可以只关注整个结构中的其中某一

Impala 源码分析-FE

By yhluo 2015年7月29日 Impala 3 Comments Impala 源代码目录结构 SQL 解析 Impala 的 SQL 解析与执行计划生成部分是由 impala-frontend(Java)实现的,监听端口是 21000.用户通过Beeswax 接口 BeeswaxService.query() 提交一个请求,在 impalad 端的处理逻辑是由void ImpalaServer::query(QueryHandle& query_handle, const Query