C# base和this

Unity学习(C#)——this和base、抽象类 this和base:this可以访问当前类中的字段和方法,有没有this都可以访问。当方法的参数和字段重名时,使用this表明访问的是类中的字段。base调用父类中的方法和字段。使用base和this会自动提示有那些方法,比较方便。 抽象类:只有函数定义,没有函数体的函数,抽象函数本身也是虚拟的 当一个类中有抽象函数的时候,他自己必须也声明为抽象的。当继承了一个抽象类的时候,必须去实现抽象方法。 class Program { static void Main(string[] a 阅读详情

//    new关键字引起了大家的不少关注,尤其感谢Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在。所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关键字(Access Keywords):base和this。虽然访问关键字不是很难理解的话题,我们还是有可以深入讨论的地方来理清思路。还是老办法,我的问题先列出来,您是否做好了准备。
//  • 是否可以在静态方法中使用base和this,为什么?

//  • base常用于哪些方面?this常用于哪些方面?

//  • 可以base访问基类的一切成员吗?

//  • 如果有三层或者更多继承,那么最下级派生类的base指向那一层呢?例如.NET体系中,如果以base访问,则应该是直接父类实例呢,还是最高层类实例呢?

//  • 以base和this应用于构造函数时,继承类对象实例化的执行顺序如何?

//  2. 基本概念

//  base和this在C#中被归于访问关键字,顾名思义,就是用于实现继承机制的访问操作,来满足对对象成员的访问,从而为多态机制提供更加灵活的处理方式。

//  2.1 base关键字

//  其用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中,MSDN中小结的具体功能包括:

//  • 调用基类上已被其他方法重写的方法。

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

//  2.2 this关键字

//  其用于引用类的当前实例,也包括继承而来的方法,通常可以隐藏this,MSDN中的小结功能主要包括:

//  • 限定被相似的名称隐藏的成员

//  • 将对象作为参数传递到其他方法

//  • 声明索引器  

//  3. 深入浅出

//  3.1 示例为上

//  下面以一个小示例来综合的说明,base和this在访问操作中的应用,从而对其有个概要了解,更详细的规则和深入我们接着阐述。本示例没有完全的设计概念,主要用来阐述base和this关键字的使用要点和难点阐述,具体的如下:

//  base和this示例
using System;
namespace Anytao.net.My_Must_net
{
    public class Action
    {
        public static void ToRun(Vehicle vehicle)
        {
            Console.WriteLine("{0} is running.", vehicle.ToString());
        }
    }
    public class Vehicle
    {
        private string name;
        private int speed;
        private string[] array = new string[10];

        public Vehicle()
        {
        }
        //限定被相似的名称隐藏的成员
        public Vehicle(string name, int speed)
        {
            this.name = name;
            this.speed = speed;
        }
        public virtual void ShowResult()
        {
            Console.WriteLine("The top speed of {0} is {1}.", name, speed);
        }
        public void Run()
        {
            //传递当前实例参数
            Action.ToRun(this);
        }
        //声明索引器,必须为this,这样就可以像数组一样来索引对象
        public string this[int param]
        {
            get { return array[param]; }
            set { array[param] = value; }
        }
    }
    public class Car : Vehicle
    {
        //派生类和基类通信,以base实现,基类首先被调用
        //指定创建派生类实例时应调用的基类构造函数
        public Car()
            : base("Car", 200)
        { }

        public Car(string name, int speed)
            : this()
        { }

        public override void ShowResult()
        {
            //调用基类上已被其他方法重写的方法
            base.ShowResult();
            Console.WriteLine("It's a car's result.");
        }
    }
    public class Audi : Car
    {
        public Audi()
            : base("Audi", 300)
        { }

        public Audi(string name, int speed)
            : this()
        {
        }
        public override void ShowResult()
        {
            //由三层继承可以看出,base只能继承其直接基类成员
            base.ShowResult();
            base.Run();
            Console.WriteLine("It's audi's result.");
        }
    }
    public class BaseThisTester
    {
        public static void Main(string[] args)
        {
            Audi audi = new Audi();
            audi[1] = "A6";
            audi[2] = "A8";
            Console.WriteLine(audi[1]);
            audi.Run();
            audi.ShowResult();
        }
    }
}

  //3.2 示例说明

  //上面的示例基本包括了base和this使用的所有基本功能演示,具体的说明可以从注释中得到解释,下面的说明是对注释的进一步阐述和补充,来说明在应用方面的几个要点:

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

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

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

  //• 在多层继承中,base可以指向的父类的方法有两种情况:一是有重载存在的情况下,base将指向直接继承的父类成员的方法,例如Audi类中的ShowResult方法中,使用base访问的将是Car.ShowResult()方法,而不能访问Vehicle.ShowResult()方法;而是没有重载存在的情况下,base可以指向任何上级父类的公有或者受保护方法,例如Audi类中,可以使用base访问基类Vehicle.Run()方法。这些我们可以使用ILDasm.exe,从IL代码中得到答案。

  //Code
.method public hidebysig virtual instance void
ShowResult() cil managed
{
// 代码大小       27 (0x1b)
  .maxstack  8
IL_0000:  nop
IL_0001:  ldarg.0
//base调用父类成员
  IL_0002:  call       instance void Anytao.net.My_Must_net.Car::ShowResult()
IL_0007:  nop
IL_0008:  ldarg.0
//base调用父类成员,因为没有实现Car.Run(),所以指向更高级父类
  IL_0009:  call       instance void Anytao.net.My_Must_net.Vehicle::Run()
IL_000e:  nop
IL_000f:  ldstr      "It's audi's result."
IL_0014:  call       void [mscorlib]System.Console::WriteLine(string)
IL_0019:  nop
IL_001a:  ret
} // end of method Audi::ShowResult
 

//  3.3 深入剖析

//  如果有三次或者更多继承,那么最下级派生类的base指向那一层呢?例如.NET体系中,如果以base访问,则应该是直接父类实例呢,还是最高层类实例呢?

//  首先我们有必要了解类创建过程中的实例化顺序,才能进一步了解base机制的详细执行过程。一般来说,实例化过程首先要先实例化其基类,并且依此类推,一直到实例化System.Object为止。因此,类实例化,总是从调用System.Object.Object()开始。因此示例中的类Audi的实例化过程大概可以小结为以下顺序执行,详细可以参考示例代码分析。

//  • 执行System.Object.Object();

//  • 执行Vehicle.Vehicle(string name, int speed);

//  • 执行Car.Car();

//  • 执行Car.Car(string name, int speed);

//  • 执行Audi.Audi();

//  • 执行Audi.Audi(string name, int speed)。

//  我们在充分了解其实例化顺序的基础上就可以顺利的把握base和this在作用于构造函数时的执行情况,并进一步了解其基本功能细节。

//  下面更重要的分析则是,以ILDASM.exe工具为基础来分析IL反编译代码,以便更深层次的了解执行在base和this背后的应用实质,只有这样我们才能说对技术有了基本的剖析。

//Main方法的执行情况为:

//IL分析base和this执行
.method public hidebysig static void  Main(string[] args) cil managed
{
.entrypoint
// 代码大小       61 (0x3d)
  .maxstack  3
.locals init (class Anytao.net.My_Must_net.Audi V_0)
IL_0000:  nop
//使用newobj指令创建新的对象,并调用构造函数初始化
  IL_0001:  newobj     instance void Anytao.net.My_Must_net.Audi::.ctor()
IL_0006:  stloc.0
IL_0007:  ldloc.0
IL_0008:  ldc.i4.1
IL_0009:  ldstr      "A6"
IL_000e:  callvirt   instance void Anytao.net.My_Must_net.Vehicle::set_Item(int32,
string)
IL_0013:  nop
IL_0014:  ldloc.0
IL_0015:  ldc.i4.2
IL_0016:  ldstr      "A8"
IL_001b:  callvirt   instance void Anytao.net.My_Must_net.Vehicle::set_Item(int32,
string)
IL_0020:  nop
IL_0021:  ldloc.0
IL_0022:  ldc.i4.1
IL_0023:  callvirt   instance string Anytao.net.My_Must_net.Vehicle::get_Item(int32)
IL_0028:  call       void [mscorlib]System.Console::WriteLine(string)
IL_002d:  nop
IL_002e:  ldloc.0
IL_002f:  callvirt   instance void Anytao.net.My_Must_net.Vehicle::Run()
IL_0034:  nop
IL_0035:  ldloc.0
//base.ShowResult最终调用的是最高级父类Vehicle的方法,
//而不是直接父类Car.ShowResult()方法,这是应该关注的
  IL_0036:  callvirt   instance void Anytao.net.My_Must_net.Vehicle::ShowResult()
IL_003b:  nop
IL_003c:  ret
} // end of method BaseThisTester::Main

//因此,对重写父类方法,最终指向了最高级父类的方法成员。

 

//  4. 通用规则

//  • 尽量少用或者不用base和this。除了决议子类的名称冲突和在一个构造函数中调用其他的构造函数之外,base和this的使用容易引起不必要的结果。

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

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

//  • 使用this或base关键字只能指定一个构造函数,也就是说不可同时将this和base作用在一个构造函数上。

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

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


C#每日面试题-简述this和base的作用 在C#面向对象编程中,this和base是两个与类实例、继承体系紧密关联的关键字,核心作用是“精准定位成员归属”——this指向当前类实例,base指向基类实例,二者均用于解决成员访问冲突、简化构造函数调用、明确继承关系中的成员引用。它们的用法看似基础,却直接体现对类实例化、继承底层逻辑的理解,是面试高频基础考点。本文从核心作用、场景用法、底层差异、易混点辨析四个层面,帮你彻底搞懂this和base的用法与本质。 阅读详情

相关推荐

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

执行命令: make -j 4 && make install 这里要等待一段时间,等待编译完成。执行命令: ./configure --prefix=/usr/local/src/zlilb。执行命令: ./config --prefix=/usr/local/src/openssl。执行命令: make -j 4 && make test && make install。执行命令: make -j 4 && make install。执行命令: /etc/init.d/sshd restart。

X_yufei的博客 7429

C#thie和base(二)

new关键字引起了大家的不少关注,尤其感谢Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在。所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关键字(Access Keywords):base和this。虽然访问关键字不是很难理解的话题,我们还是有可以深入讨论的地方来理清思路。还是老办法,我的问题先列出来,您是否做好了准备。   • 是否

@奮 鬥@的专栏 791

Unity 升级引擎版本后构建报错:script class layout is incompatible between the editor and the player

Unity升级引擎版本后,项目报错:script class layout is incompatible between the editor and the player。

学习与分享 593

C#构造函数、操作符重载以及自定义类型转换

构造器   构造器(构造函数)是将类型的实例初始化的特殊方法。构造器可分为实例构造器和类型构造器,本节将详细介绍有关内容。 实例构造器   顾名思义,实例构造器的作用就是对类型的实例进行初始化。如果类没有显示定义任何构造器,C#编译器会定义一个默认的无参构造器。相反,如果类中已经显示地定义了一个构造器,那么就不会再生成默认构造器了。定义实例构造器的语法这里就不再多做阐述了(该懂得要懂呀),下面通...

weixin_30868855的博客 225

分布式存储系统关于GDPR条例中的数据清除原则

文章目录前言HDFS存储系统数据的完全删除基于加解密的输入输出流的数据保护方案 前言 关于GDPR是什么,可能许多同学之前并不太了解,至少笔者在之前也是不清楚的。GDPR全称为通用数据保护条例,General Data Protection Regulation。它是一项来自欧盟的关于计算机数据保护相关的条约,旨在规范系统如何收集,管控用户私人数据的种种行为。但是当前的一些存储系统并没有完全符合...

走在前往架构师的路上 3624

Windows环境下pcl点云库 安装配置全流程(精简、有效)

本文为Windows配置点云库pcl步骤,具体是win10、visual studio 2017、pcl1.11.1。

zaibeijixing的专栏 1万+

c#语言构造方法,C#构造函数

引用类型的实例构造函数不能被继承(不过,可以通过 base 关键字调用父类的构造函数),它负责初始化类型的实例字段。对于静态字段,由静态构造函数负责。当然,也可以在实例构造函数中为静态成员赋值,但是,当之后更改这个值,再创建一个新的实例时,你会发现值又被实例构造函数改回去了。所以,通常在静态构造函数中为静态成员赋值 (因为它只会执行一次)。如果类型没有定义任何构造函数,C# 会生成一个无参实例构造...

weixin_39575737的博客 563

机器学习-深嵌交叉验证(Nested Cross-Validation)

Section I: Code and Analyses 第一部分:代码 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from...

Santorinisu Blogs 2716

[你必须知道的.NET] 第六回:深入浅出关键字---base和this

 本文将介绍以下内容:   • 面向对象基本概念   • base关键字深入浅出   • this关键字深入浅出  1. 引言  new关键字引起了大家的不少关注,尤其感谢Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在。所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关键字(Access Keywords):base和t

mzoy的专栏 672

Flow Matching03-01:微分方程【微分方程(描述变化规律的方程):包含未知函数和它的导数的方程】【公式解(精确)、数值解(逼近)】

好的,我将从数学角度详细解释Flow Matching,从高中生能理解的基础知识开始,逐步深入到高级概念。

u013250861的博客 219

VS Code下载安装与使用教程

VSCode下载安装与使用教程

weixin_46713695的博客 4万+

C# base和this的用法

C# base和this的用法1 介绍thisbase2 代码base调用构造方法base在派生类中调用基类的方法base和this的综合使用参考 1 介绍 this this关键字 this关键字引用类的当前实例 注意:静态成员方法中不能使用this关键字,this关键字只能在实例构造函数、实例方法或实例访问器中使用 base base关键字 base关键字用于从派生类中访问基类的成员; ...

天道酬勤 1528

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C#基础 - this和base的用法

最近感觉自己C#基础不够扎实,所以又回去看了一些C#的基础知识,这里主要讲解一下比较用的到的this和base的用法。 this是对象级别的使用,指向的是当前实例化的对象,主要有三种用法: 第一种,在实例化构造函数的时候,为了避免传入的参数跟类的字段同名,使用this来区分开,避免混乱。 class MyClass { private int age; p...

aibian0219的博客 493

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

c#中this和base的区别

综合来说: this相当于自己的指针;base相当于父类的指针; 一般只需要对自己操作就行了。如果是你自己写的类,继承了别的类,就会用到base了。 以下为MSDN上得帮助解释; base 关键字用于从派生类中访问基类的成员: 调用基类上已被其他方法重写的方法。 指定创建派生类实例时应调用的基类构造函数。 基类访问只能在构造函数、实例方法或实例属性访问器中进行。 从静态方法中使用 base 关键字...

weixin_43937283的博客 1381

c# 中的base和this

new关键字引起了大家的不少关注,尤其感谢Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在。所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关键字(Access Keywords):base和this。虽然访问关键字不是很难理解的话题,我们还是有可以深入讨论的地方来理清思路。还是老办法,我的问题先列出来,您是否做好了准备。   •

蚂蚁的流年 440

C# base和this的区别

• base常用于,在派生类对象初始化时和基类进行通信。   • base可以访问基类的公有成员和受保护成员,私有成员是不可访问的。   • this指代类对象本身,用于访问本类的所有常量、字段、属性和方法成员,而且不管访问元素是任何访问级别。因为,this仅仅局限于对象内部,对象外部是无法看到的,这就是this的基本思想。另外,静态成员不是对象的一部分,因此不能在静态方法中引用thi

zhangyongqiang123的专栏 749

c# :this() 和 :base()区别

在 C# 中,:this()和:base()

一个编程的同学 742

C#学习相关系列之base和this的常用方法

本文介绍了C#中关于this和base的相关用法

qiaodahua的博客 1534

C#访问关键字this和base有什么作用

this 关键字用于当前实例,而 base 关键字用于基类实例。它们能够帮助你在类的成员和构造函数中正确引用所需的实例。在C#中,关键字 this 和 base 分别用于引用当前实例和基类实例的成员。

一个专注于技术研究创新的程序员 594
上一篇: Design_Pattern-Prototype
下一篇: 不同服务器数据库之间的数据操作
andycode
博客等级 码龄17年 12粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值