首页 > 编程语言 >c# 编译器是如何帮我们实现方法重载 重写的

c# 编译器是如何帮我们实现方法重载 重写的

时间:2024-06-08 21:55:30浏览次数:52  
标签:调用 c# 方法 绑定 编译器 重载 重写

在C#中,编译器通过以下方式帮助我们实现方法重载(Overloading)和方法重写(Overriding):

方法重载(Method Overloading)

原理

  • 编译时解析:C#编译器在编译阶段根据方法调用时提供的参数类型和数量来决定调用哪个重载版本。这个过程称为静态绑定或早期绑定,因为它发生在编译时期。
  • 签名匹配:编译器检查方法名相同但参数列表不同的方法。参数列表的不同可以是参数的数量、类型或顺序。返回类型不作为重载的判断依据。
  • 生成方法表:编译器为每个重载方法生成唯一的内部名称,并在类的元数据中记录所有重载方法的信息,包括参数类型和数量,以供运行时调用时查找。

方法重写(Method Overriding)

原理

  • 虚方法和抽象方法:重写是基于虚方法(virtual)和抽象方法(abstract)实现的。基类中声明虚方法或抽象方法,派生类通过override关键字实现方法重写。
  • 动态绑定:与重载不同,重写的方法调用是动态绑定的,意味着在运行时而不是编译时决定调用哪个版本的方法。这个决策基于对象的实际类型而非引用类型。
  • vtable(虚拟方法表):C#编译器为包含虚方法的类生成一个vtable。每个重写了虚方法的派生类都会更新这个表,指向它们自己的实现。当通过基类引用来调用一个虚方法时,实际执行的是派生类中重写的方法,这一过程在运行时通过查找vtable完成。

总结来说,方法重载是通过编译时的静态分析和签名匹配来实现的,而方法重写则依赖于虚方法机制和运行时的动态绑定,利用vtable来达到多态性的目的。

标签:调用,c#,方法,绑定,编译器,重载,重写
From: https://www.cnblogs.com/voyager-rz/p/18238990

相关文章

  • Microsoft 收集分享
    链接:https://pan.baidu.com/s/13Lw4B6Qxq5Y65sAXwWOXYA?pwd=l9wj   WindowsServer2022SW_DVD9_Win_Server_STD_CORE_2022_2108.33_64Bit_English_DC_STD_MLF_X23-75607.ISOSHA256:5B4721A21DF2E2D7C20803BB9D64C2B5BF6ED72E612480CF9298969001B65CE8updatedMay2......
  • JavaScript html css 字符串对象
    字符串对象字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。length属性作用:获取字符串长度示例:<spanstyle="background-color:#f8f8f8"><spanstyle="color:#333333"><spanstyle="color:#770088">let</span><spanstyle=......
  • AcWing 33:链表中倒数第k个节点 ← 尾插法
    【题目来源】https://www.acwing.com/problem/content/32/【题目描述】输入一个链表,输出该链表中倒数第k个结点。注意:  ●k>=1;  ●如果k大于链表长度,则返回NULL;【数据范围】链表长度[0,30]。【输入样例】输入:链表:1->2->3->4->5,k=2【输出样例】输出:4......
  • C语言实验六
    #include<stdio.h>#include<string.h>#defineN3//运行程序输入测试时,可以把这个数组改小一些输入测试typedefstructstudent{intid;//学号charname[20];//姓名charsubject[20];//考试科目doublepe......
  • HCCDP 备考第二天
    流程环境预置,登录ECS测试源数据库操作云数据库RDS,作为目标数据库操作DRS在线迁移任务,完成数据迁移2.1.创建云数据库RDS实例鼠标移动到云桌面浏览器页面中左侧菜单栏,点击服务列表->”数据库”->“云数据库RDS”进入进入实例管理界面,点击“购买数据库实例”进入参数填写界面,......
  • oracle 表管理
    主键自增策略参考:Oracle实现主键自增有4种方式Oracle自增长主键三种方式Oracle中sequence(序列)详解mybatis+oracle数据库新增数据,返回主键,主键回显oracle数据类型Oracle中的数据类型详解创建表createtablesys_dict_type(idnumber(20)primarykey,namevarchar2(......
  • C# 使用 stackalloc 在栈上分配内存
    stackalloc官方文档https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/stackallocAstackallocexpressionallocatesablockofmemoryonthestack.Astack-allocatedmemoryblockcreatedduringthemethodexecutionisautomaticallyd......
  • C++ OpenCV 图像分类魔法:探索神奇的模型与代码
    ⭐️我叫忆_恒心,一名喜欢书写博客的研究生......
  • Cobalt Strike使用小记
    环境设置攻击机KaliLinux:172.24.4.7跳板机Windows10:172.24.4.22目标机Windows7:172.24.4.35Windows7作为目标机。启动CS服务端首先在Kali服务端启动CS,配置如下:IP:Kali的IP密码:demo(可以随意,但要记住)连接CS服务端在Windows10上启动CS客户端并连接......
  • C++20协程接口说明
    等待体的接口说明: boolawait_ready()表达了等待体对象是否准备就绪,返回false表示没有准备好,返回true表示准备好了,这个返回值决定了等待体的执行流程。 boolawait_suspend(Coro::coroutine_handle<Task::promise_type>)当await_ready返回fasle时,进入此函数执行,如果await_r......