C#基础总结

这里写目录标题

  • 目录
    • 1. 什么情况下需要override Equals?
    • 2. 什么时候需要override GetHashCode?
    • 3. `int`和`int?`有什么关系?两个类型转换是否涉及装箱过程?
    • 4. `String`类和`StringBuiler`类有什么区别?
    • 5. 抽象类和接口有什么区别?
    • 6.委托和事件的区别是什么?
    • 7. 值类型与引用类型有什么区别?
    • 8. 什么是装箱和拆箱?
    • 9. 什么情况使用结构(struct)?
    • 10. new关键字有哪些作用?
    • 11. 实例化类的执行顺序是什么?
    • 12. 为什么不能在基类中调用虚方法?
    • 13. 重载与重写(`override`)的区别?
    • 14. `static`关键字有哪些作用?
    • 15.`const`和`readonly`有什么区别?
    • 16. as和is的区别是什么?
    • 17. 什么对象可以被foreach遍历?
    • 18. 什么是序列化与反序列化?
    • 19. 什么是浅拷贝与深拷贝?

目录

1. 什么情况下需要override Equals?

默认情况下,C#会使用Object.Equals方法进行比较,该方法对于值类型比较的是值,对于引用类型比较的是引用。

这可能不符合预期,所以在以下情况需要进行重写Equals方法:

  • 引用类型的业务逻辑比较:对于类(class)类型,如果希望基于业务逻辑而非引用相等性来比较两个对象实例,应该重写Equals方法。例如,两个用户对象可能具有不同的属性集合,但在某些情况下,即使它们不是同一个实例,也可能被视为相等。
  • 配合集合使用:当你的对象将被用作字典(Dictionary)或哈希集合(HashSet)的键时,需要确保这些对象的EqualsGetHashCode方法被适当地重写,以保证正确的键查找行为;

2. 什么时候需要override GetHashCode?

  • 使用哈希集合:当类被用作哈希集合(如HashSetDictionary等)的键时,必须提供一个合适的GetHashCode实现,以确保对象能够正确地存储和检索。
  • 配合Equals方法:如果已经重写了Equals方法来定义两个对象相等的逻辑,那么也应该重写GetHashCode方法,以保持EqualsGetHashCode的一致性。这是因为两个相等的对象必须返回相同的哈希值(否则在资源字典中,将有可能成功地添加两个相等的对象,而在查找时又找不到对象)

3. intint?有什么关系?两个类型转换是否涉及装箱过程?

  • int是一个基本的整型数据类型,它不允许赋值为nullint?则是Nullable<int>的简写,表示可空的整型,可以赋值为任何整数值,也可以赋值为null;
  • intNullable<int>都是值类型,两个类型转化不涉及装箱过程

4. String类和StringBuiler类有什么区别?

  • String类:String是C#中不可变的字符序列,一旦创建了一个String对象,就不能更改其内容。每一次对String的操作,如拼接或修改,实际上都会创建一个新的String实例;
  • StringBuilder类:StringBuilder是一个可变的字符容器,可以在原有对象的基础上进行修改,如添加、删除和替换字符,而不会创建新的对象。它是为了解决String在频繁修改时的低效率问题而设计的。因此,当需要对字符串进行大量的修改操作时,使用StringBuilder比使用String更加高效。

5. 抽象类和接口有什么区别?

  • 继承特点:一个类只可以继承一个抽象类,但可以继承多个接口;
  • 方法实现:当一个类继承了一个抽象类,它只需要实现抽象类中的所有抽象方法(包括抽象属性),而其他方法和属性可以不重新实现;当一个类继承了一个接口,它必须实现接口定义的所有方法;
  • 成员类型:抽象类可以有构造函数,接口不能有;抽象类可以有字段,接口不能有;抽象类的成员可以是私有的,接口成员不能是私有的;
  • 设计目的:抽象类通常是为了为其他类提供一个共同的基础框架,为提炼共同实现而设计;接口为不同的类提供了一个共同遵循的标准,为了抽象。

6.委托和事件的区别是什么?

委托是一个类,其实例对象持有一个或多个方法。

委托的特点:

  • 使用方式:可以通过赋值运算符=+=来注册方法,使用-=来注销方法。可以直接被调用,以触发所引用的方法执行;
  • 使用场景:在调用方法前,某个关键部分处理方法不确定,可将委托作为参数(如LINQ查询);在异步编程中,委托常用于定义回调方法,以便在异步操作完成时执行特定的代码。

事件封装了委托,提供了更严格的访问控制,是委托的上层建筑。

  • 使用方式:只能通过+=来注册方法和通过-=来注销方法。事件的触发通常由事件源负责,而不是由外部直接调用;
  • 使用场景:实现发布-订阅模式;防止委托的滥用;

7. 值类型与引用类型有什么区别?

值类型和引用类型是C#中两种不同的数据类型。

值类型

  • 组成:基本数据类型(int、float、double、char等)和结构类型(struct);
  • 存储:数据通常存放在栈;当被包含在类中则存储在堆上;
  • 赋值:当值类型变量被赋值给另一个变量时,会进行值复制,这意味着两个变量将拥有各自的副本,对一个变量的修改不会影响另一个;
  • 大小:实例大小不大于16字节。

引用类型

  • 组成:所有类(Class)、数组(Array) 和委托(Delegate) 等;
  • 存储:引用类型需要两段内存,第一段存储实际数据,位于堆;第二段存储引用,用来指向数据在堆中的存储位置,位于栈;
  • 赋值:当引用类型变量被赋值给另一个变量时,只复制引用,因此两个变量将指向内存中的同一个对象,对一个变量的修改会影响到另一个。
  • 大小:实例大小可以大于16字节。

8. 什么是装箱和拆箱?

装箱和拆箱是值类型与引用类型之间转换时发生的操作。

  • 装箱(Boxing):是将值类型转换为引用类型的一个过程。装箱时,值类型实例被包裹在一个新的对象中,并分配在堆上,这样它就有了一个引用地址,可以作为对象使用。
  • 拆箱(Unboxing):是将引用类型转换回原来的值类型。拆箱时,从堆上的对象中提取出值类型数据,并将其复制到一个栈上的临时位置,以便作为值类型使用。

9. 什么情况使用结构(struct)?

必要条件

  • 实例大小不大于16字节(大于16字节的struct通常需要在堆上分配)
  • 值类型语义
  • 逻辑上表示单个值
  • 不必频繁装箱

使用struct的优点

  • 性能优化:当需要创建和销毁对象的频率很高时,struct可以提供更好的性能;
  • 内存优化:使用struct可以减少内存的使用,因为struct通常占用的内存比class少。
  • 值类型语义:如果希望类型具有值语义,即通过值传递而不是引用传递,那么应该使用struct。这有助于确保类型在赋值和作为参数传递时的完整性和独立性。

10. new关键字有哪些作用?

  • 创建对象实例:使用new关键字可以创建一个类或结构的新实例。
  • 隐藏基类成员:使用new隐藏基类成员是一种避免多态行为的方式,它使得派生类中的新实现仅在明确通过派生类类型调用时才会被执行(否则,只要是派生实例(哪怕它以父类身份出现),都会调用子类的方法)。

11. 实例化类的执行顺序是什么?

不考虑继承关系

  1. 静态字段
  2. 静态构造方法
  3. 实例字段
  4. 实例构造方法

考虑继承关系

  1. 子类的静态字段
  2. 子类的静态构造方法
  3. 子类的实例字段
  4. 父类的静态字段
  5. 父类的静态构造方法
  6. 父类的实例字段
  7. 父类的实例构造方法
  8. 子类的实例构造方法

12. 为什么不能在基类中调用虚方法?

在执行基类的虚方法会调用派生类的覆写方法,而派生类的构造函数尚未开始调用,从而导致在派生类未完全构造之前就已经发生了覆写方法的调用。

13. 重载与重写(override)的区别?

重载:发生在同一个类或接口中,重载的方法函数名相同,但函数签名(由名称和参数列表组成,不包括返回类型)不同;重载的方法可以有不同的访问权限;

重写:发生在继承体系中,当子类需要提供父类方法的另一种实现时使用,支持多态;重写的方法可访问性必须和基类相同。

14. static关键字有哪些作用?

  • 类级别成员static关键字用于声明类级别的成员,这意味着这些成员属于类本身,而不是类的实例。因此,它们可以在没有创建类的实例的情况下访问;
  • 共享同一个值static成员只有一份存储空间,所有实例共享这个static成员的值;
  • 静态构造函数:可以用于声明静态构造函数,它在类加载到内存时执行,通常用于初始化静态数据或执行仅需要执行一次的操作;

15.constreadonly有什么区别?

  • constconst关键字用于声明一个值永远不变的字段。这意味着const字段必须在声明时初始化,其值是在编译时确定,不能被修改。const只能声明一个简单类型、枚举类型、或者字符串类型;
  • readonlyreadonly关键字用于声明一个字段,该字段只能在声明时或构造函数中初始化,并且在对象的整个生命周期内保持不变。与const不同,readonly字段可以在运行时初始化,只要它们是在构造函数中完成的。readonly字段对于引用类型来说,意味着引用本身是只读的,但引用的对象(如果是可变的)可以改变。

16. as和is的区别是什么?

  • asas关键字用于执行安全的类型转换,即在尝试将一个表达式转换为特定类型时不会抛出异常。如果转换成功,as返回转换后的值;如果转换失败,则返回nullas运算符只适用于可以为null的类型。
  • isis关键字用于检查对象是否为特定类型的实例,或者该对象是否与指定类型兼容。is操作符返回一个布尔值,如果对象是指定的类型或其派生类型,则返回true;否则返回falseis操作符在判断类型时不会进行实际的类型转换,并且不会抛出异常。

17. 什么对象可以被foreach遍历?

任何实现了IEnumerableIEnumerable<T>接口的类型.

18. 什么是序列化与反序列化?

序列化是将对象的状态信息转换为可以存储或传输的形式的过程,而反序列化则是将这种形式的数据恢复为对象的过程。

19. 什么是浅拷贝与深拷贝?

浅拷贝(Shallow Copy)是指创建一个新对象,并且复制原始对象的引用类型成员的引用,而不复制引用类型的成员对象本身。浅拷贝后,原对象和拷贝对象的成员变量指向同一个内存地址。

深拷贝(Deep Copy)则是指创建一个新对象,并递归地复制原始对象的所有成员及其子对象,直到所有层级的对象都被复制。深拷贝后,原对象和拷贝对象的成员变量指向不同的内存地址。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

袁庭新ES系列15节|Elasticsearch客户端基础操作

前言 上一章节我们介绍了搭建Elasticsearch集群相关的知识。那么又该如何来操作Elasticsearch集群呢&#xff1f;在ES官网中提供了各种语言的客户端&#xff0c;我们在项目开发过程中有多种Elasticsearch版本和连接客户端可以选择&#xff0c;那么他们有什么区别&#xff1f;这…

uniapp Android 插件开发教程

一、下载uniapp提供的SDK Android 离线SDK - 正式版 | uni小程序SDK 二、在uniapp创建一个项目 查看包名&#xff1a;发行--> 原生app 云打包 三、进入dcloud官网 开发者中心 进入 应用管理 --> 我的应用 --> 点击应用名称-->各平台信息-->新增 这里需要这…

【可视化大屏开发】19. 加餐-百度地图API实现导航加线路热力图

需求 Web端使用场景中会涉及到地图导航路线情况&#xff0c;并利用热力图显示路况信息。 实现效果如下&#xff1a; 输入起始地点&#xff0c;选择并开始导航 最终效果 思路步骤 利用百度地图API显示地图交通拥堵情况的热力图&#xff0c;需要按照以下步骤进行开发 步骤1&a…

面试被问懵了:手撕 Transformer

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今年最大…

Vue入门篇:概念,快速入门,插值表达式,核心特性,基本Vue指令

目录 1.Vue是什么2.快速入门3.插值表达式{{}}1.作用:2.语法:3.插值表达式的注意点: 4.Vue响应式核心特性5.Vue指令 1.Vue是什么 Vue是一个流行的JavaScript框架&#xff0c;用于构建用户界面。它是一种用于构建单页面应用程序&#xff08;SPA&#xff09;的渐进式框架&#xff…

MySQL 列数据跨表拷贝,一句SQL快速将表A每条记录的某些字段拷贝到表B每条记录的某些字段(A、B表通过ID等字段对应)

文章目录 MySQL 列数据跨表拷贝&#xff0c;一句SQL快速将表A每条记录的某些字段拷贝到表B每条记录的某些字段&#xff08;A、B表通过ID等字段对应&#xff09;背景定义表填充测试数据跨表一 一对应拷贝列数据SQL参考资料 MySQL 列数据跨表拷贝&#xff0c;一句SQL快速将表A每条…

【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字

目录 一&#xff0c;函数重载1.1 函数重载的定义1.1.1.形参的类型不同1.1.2参数的个数不同1.1.3.参数的顺序不同1.1.4.有一个是缺省参数构成重载。但是调用时存在歧义1.1.5.返回值不同&#xff0c;不构成重载。因为返回值可接收&#xff0c;可不接受&#xff0c;调用函数产生歧…

Python 比较文本文件

1、问题背景 我们需要比较一个文本文件 F 与路径下多个其他文本文件之间的差异。我们已经编写了以下代码&#xff0c;但只能输出一个文件的比较结果。我们需要修改代码&#xff0c;以便比较所有文件并打印所有结果。 import difflib import fnmatch import osfilelist[] f op…

Don‘t fly solo! 量化之路,AI伴飞

在投资界&#xff0c;巴菲特与查理.芒格的神仙友谊&#xff0c;是他们财富神话之外的另一段传奇。巴菲特曾这样评价芒格&#xff1a;他用思想的力量拓展了我的视野&#xff0c;让我以火箭的速度&#xff0c;从猩猩进化到人类。 人生何幸能得到一知己。如果没有这样的机缘&…

使用共振峰提取元音音素/从声音生成口型动画

视频效果 我前段时间研究了下从声音提取共振峰的方法。今天测试了下实际效果。 我使用一段33秒的女声视频&#xff0c;提取元音后使用静态视位图序列生成了一个视频&#xff0c;效果如下&#xff1a; b站视频&#xff1a; https://www.bilibili.com/video/BV1JD421H7m9/?vd_…

泛型的初步认识(2)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x…

MYSQL之增删改查(中)

前言&#xff1a; 以下是MySQL最基本的增删改查语句&#xff0c;很多IT工作者都必须要会的命令&#xff0c;也 是IT行业面试最常考的知识点&#xff0c;由于是入门级基础命令&#xff0c;所有所有操作都建立在单表 上&#xff0c;未涉及多表操作。 4、“查”——之单表查询 My…

html select 支持内容过滤列表 -bootstrap实现

实现使用bootstrap-select插件 http://silviomoreto.github.io/bootstrap-select <!DOCTYPE html> <html> <meta charset"UTF-8"> <head><title>jQuery bootstrap-select可搜索多选下拉列表插件-www.daimajiayuan.com</title>&…

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …

面试不慌张:一文读懂FactoryBean的实现原理

大家好&#xff0c;我是石头~ 在深入探讨Spring框架内部机制时&#xff0c;FactoryBean无疑是一个关键角色&#xff0c;也是面试中经常出现的熟悉面孔。 不同于普通Java Bean&#xff0c;FactoryBean是一种特殊的Bean类型&#xff0c;它的存在并非为了提供业务逻辑&#xff0c;…

使用Python进行自动化测试

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 如何使用Python进行自动化测试&#xff1a;测试框架的选择与应用 自动化测试是软件开发过程…

代码随想录算法训练营DAY28|C++回溯算法Part.4|93.复原IP地址、78.子集、90.子集II

文章目录 93.复原IP地址思路确定非法的范围树形结构 伪代码 78.子集思路伪代码实现CPP代码 90.子集II思路CPP代码用used去重的办法用set去重的版本不使用used数组、set的版本 93.复原IP地址 力扣题目链接 文章讲解&#xff1a;93.复原IP地址 视频讲解&#xff1a;回溯算法如何分…

curlftpfs和fusermount

curlftpfs 是一种 Linux 系统下用来将 FTP 服务器挂载为文件系统的工具&#xff0c;这意味着可以通过本地目录来访问和操作 FTP 服务器上的文件。 挂载FTP服务器到本地系统 为了挂载FTP服务器到本地系统中&#xff0c;使用curlftpfs工具&#xff0c;可以按照以下格式书写命令…

如何通过MSTSC连接Ubuntu的远程桌面?

正文共&#xff1a;666 字 12 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了如何通过VNC连接Ubuntu 18.04的远程桌面&#xff08;Ubuntu 18.04开启远程桌面连接&#xff09;&#xff0c;非常简单。但是有小伙伴咨询如何使用微软的远程桌面连接MSTSC&#xff08…

黑灰产行业简介

参考&#xff1a;2021年黑灰产行业研究及趋势洞察报告 1. 有哪些场景面临大量黑灰产攻击&#xff1f; 1.营销活动场景 -- 该场景最为猖獗 1. 抹机及接码注册&#xff1a;黑灰产会使用抹机工具修改设备参数伪装成一台新设备&#xff0c;再配合联系卡商进行手机号接码&#xf…
最新文章