《.NET程序员面试秘笈》----面试题12 访问关键字this和base有什么作用

简介: 【考点】this的理解,base的理解。

本节书摘来自异步社区《.NET程序员面试秘笈》一书中的第1章,面试题12,作者: 张云翯, 更多章节内容可以访问云栖社区“异步社区”公众号查看。

面试题12 访问关键字this和base有什么作用

.NET程序员面试秘笈
【考点】this的理解,base的理解。

【出现频率】

【解答】

this关键字用于引用类的当前实例。base关键字用于派生类访问基类成员。

为了说明this和base在类中的具体应用,在ch01目录下新建一个程序文件,并命名为This.cs,编写代码如程序1.13所示。

程序1.13 this和base示例:This.cs

  using System;

  class This
  {
    static void Main()
    {
      Console.WriteLine("请输入书名:");
      string inputA = Console.ReadLine();
      Console.WriteLine("请输入作者:");
      string inputB = Console.ReadLine();
      //将用户输入的2个字符串传递给构造函数,创建Book类的实例bk
      Book bk = new Book(inputA, inputB);     
      //调用bk实例的getbook方法,并输出
      Console.WriteLine(bk.getbook());
      //创建PCBook类的实例pcbk
      PCBook pcbk = new PCBook();
      //调用pcbk实例的words方法
      pcbk.words();
    }
  }

  class Book              //声明Book类
  {
    private string _name;
    private string _author;
    internal Book()          //编写默认构造函数
    {
      Console.WriteLine("\n书是人类进步的阶梯!");
    }
    internal Book(string n, string a)   //编写重载构造函数
    {
      this._name = n;
      this._author = a;
    }
    internal string getbook()      //定义getbook方法
    {
       //拼接字符串,访问当前实例的Name属性,并调用Tool类的静态add方法,当前实例作为参数
      string booktxt = "\n【BookName】" + this.Name + "【Author】"+ Tool.add(this);    
      return booktxt;
    }
    internal string Name
    {
      get
      {
        return _name;
      }
    }
    internal string Author
    {
      get
      {
        return _author;
      }
    }
    internal virtual void words()     //定义words虚方法
    {
      Console.WriteLine("\n知识就是力量!");
    }
  }
  static class Tool
  {
    internal static string add(Book b)  //定义静态方法add,接收参数为Book类型
    {
      return b.Author;    
    }
  }
  class PCBook : Book         //声明PCBook类,继承Book类
  {
    internal PCBook() : base()    //默认构造函数预先调用基类默认构造函数
    {
      Console.WriteLine("来买计算机书籍吧!");
    }
    internal override void words()
    {
      base.words();        //调用基类的words虚方法 
      Console.WriteLine("计算机知识也是力量!");
    }
  }

在命令行下编译This.cs后,执行This程序,其效果如图1.19所示。


dffbc23959f0905c96ab636ef4dfcbd2fd755f41

本例展示了this和base在类中的应用,其程序工作步骤如下所示。

(1)主程序中接收了用户输入的两个值(书名和作者),然后将这两个值传递给Book类的构造函数,创建实例bk。这个步骤中,bk对象的_name字段和_author字段被赋予了新值,可见,this的作用即引用当前的实例对象,其代码如下:

this._name = n;         //n为构造函数接收的第1个字符串参数
this._author = a;        //a为构造函数接收的第2个字符串参数

(2)调用bk对象的getbook方法,其方法体调用了Tool类的静态方法add静态方法,并通过this向其传递当前实例。getbook方法实际执行代码如下:

//Tool.add(this)返回当前实例的Author属性
string booktxt = "\n【BookName】" + this.Name + "【Author】"+ this.Author; 
//本方法最终返回booktxt变量
return booktxt;

(3)创建PCBook类的实例pcbk,由于其默认构造函数将通过base调用基类的默认构造函数,所以创建pcbk的实例将执行以下代码:

Console.WriteLine("\n书是人类进步的阶梯!");    //通过base()调用基类的默认构造函数
Console.WriteLine("来买计算机书籍吧!");      //PCBook类的默认构造函数的函数体

(4)pcbk调用words方法,PCBook类的words方法继承并重写了Book类的words方法。PCBook类的words方法体中通过base.words(),调用了基类的words方法(未被重写)。所以pcbk对象的words方法实际执行代码如下:

Console.WriteLine("\n知识就是力量!");       //通过base.words()调用基类的words方法
Console.WriteLine("计算机知识也是力量!");

【分析】

在面向对象的编程中,this访问关键字使用非常频繁,其中文意思为“这个”,非常形象地描述了this关键字的作用。类通过创建实例执行具体的任务,而类体代码中的this用于引用类的当前实例。相应地,静态成员和实例无关,所以静态成员中不能使用this。

注意:
this仅限于构造函数和方法成员中使用。
base访问关键字可用于访问基类成员,即基类被重写的方法和基类的构造函数。由于派生类继承了所有的基类成员,所以一般的基类成员可直接访问,但是基类被重写的虚方法只能通过base访问。同样,如果创建派生类的实例,其构造函数可通过base访问基类的构造函数,复用基类构造函数体的代码。这两种情况下,base的使用方法如以下代码所示:

base.方法名([参数列表]);            //用于派生类访问基类被重写的方法
派生类名称([参数列表]) : base(参数列表)     //派生类构造函数预先调用基类构造函数
{
}

注意:
base关键字访问基类的成员时,必须保证基类成员有相应的访问权限。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
18天前
|
Java 程序员
面试官的加分题:super关键字全解析,轻松应对!
小米,29岁程序员,通过一个关于Animal和Dog类的故事,详细解析了Java中super关键字的多种用法,包括调用父类构造方法、访问父类成员变量及调用父类方法,帮助读者更好地理解和应用super,应对面试挑战。
34 3
|
2月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
44 2
|
3月前
|
缓存 安全 Java
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
Java的特点和优点,、Java 8的新特性、面向对象、基本数据类型和引用类型、自动拆装箱与自动装箱、==与equals()的区别、为什么重写equals()就要重写hashcode()、抽象类和接口的区别、重载和重写的区别、四种引用方式、wt()和sleep()的区别、java方法是值传递还是引用传递?访问修饰符、static、final、this和super、volatile的用法及原理
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
|
3月前
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
348 6
|
4月前
|
算法 Java 测试技术
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
|
4月前
|
API
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
|
4月前
|
Java
【Java基础面试四十一】、说一说你对static关键字的理解
这篇文章主要介绍了Java中static关键字的概念和使用规则,强调了类成员与实例成员的区别及其作用域的限制。
|
5月前
|
开发框架 前端开发 JavaScript
基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
|
5月前
|
开发框架 缓存 NoSQL
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
|
4月前
|
开发框架 .NET C#
【Azure Developer】C# / .NET 静态函数中this关键字的作用
【Azure Developer】C# / .NET 静态函数中this关键字的作用
下一篇
DataWorks