C# 虚方法和抽象方法的区别,重写和重载的区别,参数修饰符(ref、out、in、params)--09

目录

一.虚方法和抽象方法的区别

1.虚方法

2.抽象方法

3.虚方法和抽象方法的区别

二.重写和重载的区别

1.重写

2.重载

3.重写和重载的区别

三.参数修饰符

1.ref参数

2.out参数

3.in参数

4.params参数

5.异同点比较


一.虚方法和抽象方法的区别

1.虚方法

定义:

  • 虚方法是在基类中使用virtual关键字定义的方法
  • 这些方法在基类中具有一个默认实现

 重写:

  • 派生类可以使用override关键字重写虚方法
  • 如果派生类不重写虚方法,那么将使用基类的实现

使用场景:

  • 虚方法适用于需要在基类中提供一个默认实现,但允许派生类根据需要进行重写的情况。

代码示例:

public class BaseClass
{public virtual void Display(){Console.WriteLine("基本类显示");}
}public class DerivedClass : BaseClass
{public override void Display(){Console.WriteLine("派生类显示");}
}

2.抽象方法

定义:

  • 抽象方法是在抽象类中使用abstract关键字定义的方法
  • 抽象方法没有方法体(即没有实现),它们只能在抽象类中声明

重写:

  • 派生类必须实现抽象方法(即必须使用override关键字提供方法的实现)
  • 抽象方法强制派生类提供具体实现

应用场景:

  • 抽象方法适用于需要在基类中定义一个方法签名,但不提供具体实现的情况.这要求所有派生类必须实现该方法

代码示例:

public abstract class BaseClass
{public abstract void Display();
}public class DerivedClass : BaseClass
{public override void Display(){Console.WriteLine("派生类实现");}
}

3.虚方法和抽象方法的区别

1)是否有默认实现:

  • 虚方法在基类中有默认实现
  • 抽象方法在基类中没有实现,必须在派生类中实现

2)是否强制实现:

  • 虚方法可以选择在派生类中重写
  • 抽象方法必须在派生类中实现

速记:因为在继承含有虚方法的类时,虚方法已经在基类中写过方法体,可以理解为基类中已经写过一次的方法在派生类中可以但是没有必要去重写虚方法(仅有需要的情况下再去重写)
在继承抽象类时,如果抽象类中含有(一个或一个以上的)抽象方法,由于抽象方法在基类中只有方法并没有方法体,可以理解为当派生类继承基类中的抽象方法时,必须去补充基类中抽象方法缺乏的方法体(即重写抽象方法)

3)类的定义:

  • 虚方法可以在普通类或抽象类中定义
  • 抽象方法只能在抽象类中定义

二.重写和重载的区别

1.重写

定义:

  • 重写是指在派生类中提供基类中已定义的虚方法或抽象方法的新实现

关键字:

  • 使用override关键字来重写基类的方法
  • 基类的方法必须使用virtual(虚方法)或abstract(抽象方法)关键字标识,以允许派生类进行重写

目的:

  • 重写的目的是为了在派生类中改变或扩展基类方法的行为

签名:

  • 重写的方法必须具有与被重写方法相同的签名,包括方法名,参数类型和参数个数

运行时行为:

  • 重写是在运行时决定的,属于动态多态性

代码示例:

public class BaseClass
{public virtual void Display(){Console.WriteLine("基类中的方法");}
}public class DerivedClass : BaseClass
{public override void Display(){Console.WriteLine("派生类中的方法");}
}

2.重载

定义:

  • 重载是指在同一个类中定义多个方法,这些方法具有相同的名字但参数不同(参数类型或参数个数不同)

关键字:

  • 不需要任何特殊的关键字来实现重载,只需定义方法时改变参数列表

目的:

  • 重载的目的是为了提供方法的多种实现形式,以便在调用时根据不同的参数组合执行不同的操作

签名:

  • 重载的方法必须有不同的参数签名(参数类型或个数不同),方法名相同

运行时行为:

  • 重载是在编译时决定的,属于静态多态性

代码示例:

public class ExampleClass
{public void Display(){Console.WriteLine("无参数显示");}public void Display(string message){Console.WriteLine("显示一个字符串: " + message);}public void Display(int number){Console.WriteLine("显示一个int型整数: " + number);}
}

3.重写和重载的区别

相同点:

  1. 方法的多态性:两者都与方法的多态性有关,尽管它们实现的多态性类型不同
  2. 提高代码灵活性:都用于提高代码的灵活性和可维护性
  3. 方法名相同:在两种情况下,方法名都保持不变

不同点:

  1. 概念不同:

    • 重写:用于在派生类中改变基类方法的实现
    • 重载:用于在同一个类中定义方法的多个版本,参数列表不同
  2. 关键字

    • 重写:需要使用override关键字,基类方法必须是virtual或abstract
    • 重载:不需要特殊关键字,只需方法参数列表不同
  3. 类层次结构

    • 重写:发生在继承层次结构中,涉及基类和派生类
    • 重载:发生在同一个类中或基类与派生类中
  4. 方法签名

    • 重写:方法签名必须与基类方法完全一致
    • 重载:方法签名必须不同(参数类型或数量不同)
  5. 多态性类型

    • 重写:实现运行时多态性(动态多态性)
    • 重载:实现编译时多态性(静态多态性)

三.参数修饰符

1.ref参数

用法:

  • 引用传递:ref参数使参数按引用传递,而不是按值.这意味着在方法内部对参数的修改将影响到调用方法的变量
  • 初始化要求:在将参数传递给ref参数之前,必须对其进行初始化

代码示例:

void AddTen(ref int number)   
{number += 10;   
}int value = 5;   
AddTen(ref value);   
Console.WriteLine(value); // 输出15
//变量value在传递给AddTen方法时,必须已经被初始化
//方法内部对number的修改会直接影响到value。

在将参数传递给ref修饰的方法之前
参数必须在进入方法之前进行显示初始化
参数在方法内容可以修改并且会影响原数值,但是并不强制在方法内部修改参数

2.out参数

用法:

  • 输出参数:out参数用于从方法中输出数据,通常用于需要从方法返回多个值的情况
  • 初始化要求
    • 在传递给方法之前,out参数不需要初始化
    • 在方法内部,必须对out参数赋值,确保在方法返回时具有确定的值

代码示例:

bool TryParseInt(string s, out int result)   
{try{result = int.Parse(s);return true;}catch{result = 0;return false;}   
}int number;   
if (TryParseInt("123", out number))   
{Console.WriteLine(number); // 输出123   
}   
else   
{Console.WriteLine("无法解析输入字符串。");
}

在将参数传递给out修饰的方法之前

参数在进入方法之前可以不对其进行显示初始化,也可以在进入方法前初始化参数,但是初始化的参数数值并不会进入方法的内部并且原数值会被传出的数值覆盖(相当于无效的赋值),因为out修饰的方法仅用于传出数据

参数必须在方法内部进行修改并且会影响到原数值

3.in参数

用法:

  • 只读引用传递:in参数也按引用传递,但在方法内部无法修改参数的值.主要用于避免值类型的大规模拷贝,同时保证数据不可变性
  • 初始化要求:在传递给方法之前,in参数必须被初始化

代码示例:

public struct LargeStruct   
{public int X;public int Y;   
}public static void ProcessData(in LargeStruct data)   
{// data.X=20 错误 in参数在方法内部是只读的,不能进行修改// 不能修改 data.X 或 data.YConsole.WriteLine(data.X + data.Y);   
}public static void Main()   
{LargeStruct myData = new LargeStruct { X = 10, Y = 20 };ProcessData(in myData);   //输出:30
}

in修饰的方法是按引用传递的,主要用于优化性能,特别是在传递大型结构体时,可以在不增加内存开销的情况下提高方法的性能

参数在进入方法之前必须对其进行显示初始化(和ref一样)

参数在方法内部是只读的(即在方法内部是不能够对其进行修改的)

4.params参数

用法:

  • 可变参数列表:params参数使方法能够接受数量可变的参数,这些参数被当作数组处理
  • 位置:params参数必须是方法的最后一个参数

代码示例:

void PrintNumbers(params int[] numbers)   
{foreach (int number in numbers){Console.WriteLine(number);}
}PrintNumbers(1, 2, 3, 4, 5);
//PrintNumbers方法可以接受任意数量的整数参数,也可以接受一个整数数组

5.异同点比较

传递方式:

  • ref和out和in:都是按引用传递参数,但有不同的使用场景和限制
  • params:用于可变参数列表,按数组传递(接收0个或者多个参数)

初始化要求:

  • ref:在传递之前必须初始化
  • out:在传递之前不需要初始化,方法内部必须赋值
  • in:在传递之前必须初始化,方法内部不能修改其值

方法内部操作:

  • ref:方法内部可以读取和修改参数的值
  • out:方法内部必须对参数赋值.可以读取和修改
  • in:方法内部只能读取参数的值.不能修改
  • params:方法内部将接收到的参数作为数组处理

不要将ref和out混淆

ref用于传入和传出数据,out仅用于传出数据

对于大型结构体,使用in,ref可以避免值的拷贝,提高性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/399.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏引擎学习第78天

Blackboard: Position ! Collision “网格” 昨天想到的一个点,可能本来就应该想到,但有时反而不立即思考这些问题也能带来一些好处。节目是周期性的,每天不需要全程关注,通常只是在晚上思考,因此有时我们可能不能那么…

后端服务集成ElasticSearch搜索功能技术方案

文章目录 一、为什么选用ElasticSearch二、ElasticSearch基本概念1、文档和字段2、索引和映射3、倒排索引、文档和词条4、分词器 三、ElasticSearch工作原理1、Term Dictionary、Term index2、Stored Fields3、Docs Values4、Segment5、Lucene6、高性能、高扩展性、高可用①高性…

js:正则表达式

目录 正则表达式的语法 定义 检测 检索 元字符 边界符 量词 字符类 表单判断案例 修饰符 过滤敏感词 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本字符组合模式 正则表达式是一…

[创业之路-242]:《华为双向指挥系统》-1-组织再造-企业普遍采用的5种组织结构形式

目录 一、直线式 二、职能式 三、直线职能式 四、矩阵式(项目矩阵) 五、事业部式 企业采用哪一种管理组织形式要根据企业具体的生产经营活动特点而定,不同的企业组织形式也不同,目前企业中普遍采用的组织形式主要有直线式、职…

elasticsearch中IK分词器

1、什么是IK分词器 ElasticSearch 几种常用分词器如下: 分词器分词方式StandardAnalyzer单字分词CJKAnalyzer二分法IKAnalyzer词库分词 分词∶即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库…

【简博士统计学习方法】第2章:3. 感知机——学习算法之原始形式:算法解说

3. 感知机——学习算法之原始形式:算法解说 3.1 学习问题 给定训练数据集: T { ( x 1 , y 1 ) , ( x 2 , y 2 ) ⋯ , ( x N , y N ) } T\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right) \cdots,\left(x_{N}, y_{N}\right)\right\} T{(x…

Browser-Use Web UI:浏览器自动化与AI的完美结合

Browser-Use Web UI:浏览器自动化与AI的完美结合 前言简介一、克隆项目二、安装与环境配置1. Python版本要求2. 安装依赖3. 安装 Playwright4. 配置环境变量(非必要步骤)三、启动 WebUI四、配置1. Agent设置2. 大模型设置3. 浏览器相关设置4. 运行 Agent结语前言 Web UI是在…

C# XPTable 日期字段处理(XPTable控件使用说明十三)

1、SQLite数据库定义为日期类型 2、XPtable中日期字段定义与显示 //显示时间表columnModel1.Columns.Clear();columnModel1.Columns.Add(new NumberColumn("id", 30));NumberColumn numberColumn new NumberColumn("次数", 50);numberColumn.Maximum 100…

笔记本电脑 选购 回收 特权模式使用 指南

笔记本电脑 factor 无线网卡:有些笔记本无法检测到特定频段的信息,会导致连不上校园网 sudo iwlist wlp2s0 scan | grep Frequency > net.txt cat net.txt>表示用终端输出覆盖后续文件,>>表示添加到后续文件的末尾 一种更简…

openCvSharp 计算机视觉图片找茬

一、安装包 <PackageReference Include"OpenCvSharp4" Version"4.10.0.20241108" /> <PackageReference Include"OpenCvSharp4.runtime.win" Version"4.10.0.20241108" /> 二、准备两张图片 三、编写代码 using OpenCv…

基于Python的社交音乐分享平台

基于Python的社交音乐分享平台是一个集成了音乐分享、社交互动以及个性化推荐等多功能于一体的综合性平台。 一、平台概述 该平台利用Python的强大功能和高效开发特性&#xff0c;结合前端技术如HTML、CSS、JavaScript以及前端框架如Vue.js或React&#xff0c;共同构建了一个…

潜力巨大但道路曲折的量子计算

近一年来&#xff0c;由于工作的原因参观访问了一些量子产业园&#xff0c;接触了量子加密计算机、量子云计算等非常炫酷的概念性产品&#xff0c;这与自己一直认为的“量子技术仍然处于实验室研究阶段”的基本判断与认知产生了强烈的冲突&#xff0c;一刹那间&#xff0c;心中…

互联网全景消息(10)之Kafka深度剖析(中)

一、深入应用 1.1 SpringBoot集成Kafka 引入对应的依赖。 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupI…

21、Transformer Masked loss原理精讲及其PyTorch逐行实现

1. Transformer结构图 2. python import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_printoptions(precision3, sci_modeFalse)if __name__ "__main__":run_code 0batch_size 2seq_length 3vocab_size 4logits torch.randn(batch…

Agentless:OpenAI 采用的非代理框架

不需要代理库来解决复杂的业务问题。Agentless 是OpenAI采用的非代理框架&#xff0c;用于在 o3 的 SWE Bench 上实现最高精度。SWE-bench 是 github的真实软件工程问题基准。Agentless 遵循简单的三阶段流程&#xff1a;本地化、修复和补丁验证&#xff1a; 1 ⃣生成存储库的…

【前端动效】原生js实现拖拽排课效果

目录 1. 效果展示 2. 效果分析 2.1 关键点 2.2 实现方法 3. 代码实现 3.1 html部分 3.2 css部分 3.3 js部分 3.4 完整代码 4. 总结 1. 效果展示 如图所示&#xff0c;页面左侧有一个包含不同课程&#xff08;如语文、数学等&#xff09;的列表&#xff0c;页面右侧…

给DevOps加点料:融入安全性的DevSecOps

从前&#xff0c;安全防护只是特定团队的责任&#xff0c;在开发的最后阶段才会介入。当开发周期长达数月、甚至数年时&#xff0c;这样做没什么问题&#xff1b;但是现在&#xff0c;这种做法现在已经行不通了。 采用 DevOps 可以有效推进快速频繁的开发周期&#xff08;有时…

CTFshow—文件包含

Web78-81 Web78 这题是最基础的文件包含&#xff0c;直接?fileflag.php是不行的&#xff0c;不知道为啥&#xff0c;直接用下面我们之前在命令执行讲过的payload即可。 ?filephp://filter/readconvert.base64-encode/resourceflag.php Web79 这题是过滤了php&#xff0c;…

年度技术突破奖|中兴微电子引领汽车芯片新变革

随着以中央计算区域控制为代表的新一代整车电子架构逐步成为行业主流&#xff0c;车企在电动化与智能化之后&#xff0c;正迎来以架构创新为核心的新一轮技术竞争。中央计算SoC&#xff0c;作为支撑智驾和智舱高算力需求的核心组件&#xff0c;已成为汽车电子市场的重要新增量。…

交响曲-24-3-单细胞CNV分析及聚类

CNV概述 小于1kb是常见的插入、移位、缺失等的变异 人体内包含<10% 的正常CNV&#xff0c;我们的染色体数是两倍体&#xff0c;正常情况下&#xff0c;只有一条染色体表达&#xff0c;另一条沉默&#xff0c;当表达的那条染色体发生CNV之后&#xff0c;表达数量就会成倍增加…