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.mzph.cn/diannao/1047.shtml

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

相关文章

【热门话题】探索与心得:深入体验Microsoft Edge浏览器

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 探索与心得&#xff1a;深入体验Microsoft Edge浏览器一、Edge浏览器概述1.1 发…

基于微信小程序的房屋租赁管理系统

介绍 基于微信小程序房屋租赁管理系统&#xff0c;对房东-房屋-房间-租客进行网格化管理&#xff0c;帮助政府部门统计分析所辖区域的出租房屋情况。 微信小程序可以视为一种新形态的应用。相比于已有的嵌入在浏览器中的HTML5网页应用&#xff0c;他具有更高的系统权限&#x…

大型网站系统架构演化实例_5.使用反向代理和CDN加速网站响应

1.使用反向代理和CDN加速网站响应 随着网站业务不断发展&#xff0c;用户规模越来越大&#xff0c;由于区域的差别使得网络环境异常复杂&#xff0c;不同地区的用户访问网站时&#xff0c;速度差别也极大。有研究表明&#xff0c;网站访问延迟和用户流失率正相关&#xff0c;网…

【嵌入式】交叉编译指南:将开源软件带到嵌入式世界

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

Rust入门-Hello World

1、安装 在 Linux 或 macOS 上安装 rustup 打开终端并输入下面命令&#xff1a; $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh如果安装成功&#xff0c;将出现下面这行&#xff1a; Rust is installed now. Great!2、更新 $ rustup self uninstall3、卸…

mybatis一对一,多对一,一对多--使用自动映射避免繁琐的resultMap

头疼的一对一&#xff0c;多对一&#xff0c;一对多写法 我们知道&#xff0c;相比较hibernate,mybatis的一对一&#xff0c;一对多都比较繁琐&#xff0c;hibernate可以直接在实体类里面配置好映射关系&#xff0c;获取值的时候就能把一对一和一对多的对象带出来了&#xff0…

红黑树(Red-Black Tree)

红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉查找树&#xff0c;它具有以下特性&#xff1a; 1. 每个节点要么是红色&#xff0c;要么是黑色。 2. 根节点是黑色的。 3. 每个叶子节点&#xff08;NIL节点&#xff09;是黑色的。 4. 如果一个节点是红色的&am…

手把手教你实现贪吃蛇

前言 在实现贪吃蛇前&#xff0c;我们需要熟练地掌握C语言知识&#xff0c;对初阶数据结构中的链表有一定的掌握&#xff0c;并且我们还会使用到Win 32 API 的知识&#xff0c;下面我会对需要使用到的API接口函数进行解释。最终的代码我放在后面&#xff0c;有需要的可以自取。…

探索C语言数据结构:利用顺序表完成通讯录的实现

在好久之前我就已经学习过顺序表&#xff0c;但是在前几天再次温习顺序表的时候&#xff0c;我惊奇的发现顺序编表可以完成我们日常使用的通讯录的功能&#xff0c;那么今天就来好好通过博客总结一下通讯录如何完成吧。 常常会回顾努力的自己&#xff0c;所以要给自己的努力留…

OpenHarmony其他工具类—lua

简介 Lua是一种功能强大、高效、轻量级、可嵌入的脚本语言。 支持过程编程、面向对象编程、函数编程、数据驱动编程和数据描述。 下载安装 直接在OpenHarmony-SIG仓中搜索lua并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的lua库代码存在以下路径&#…

Java Web3-2 - tomcat

https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/Tomcat_架构解析.md https://zhuanlan.zhihu.com/p/40249834 早期&#xff0c;web技术主要用于浏览静态页面 时间发展&#xff0c;用户已经不满足于仅浏览静态页面。用户需要一些交互操作&#xff0c;获取…

服务器有哪些特性?

服务器是计算机的一种&#xff0c;但是和普通的计算机是不同的&#xff0c;服务器比普通计算机的运行速度更快、负载能力更高&#xff0c;可以在网络中为其它客户机或是大型设备提供计算或者是应用服务&#xff0c;服务器有着高速的CPU运算能力、能够进行长时间的运行有着更好的…

STM32G431RBT6之时钟树配置与生成工程

默认大家都下载了蓝桥杯嵌入式资源包了哈. 首先,打开cubumx,修改RCC与SYS. 打开并观察原理图,发现晶振是24Mhz. 第一步,打开Clock Configuration. 第二步,修改晶振为原理图相对应的24Mhz. 第三步,切换到HSE. 第四步,切换到PLLCLK. 第五步,设置HCLK为80Mhz(15届真题要求为8…

洛谷P1057 [NOIP2008 普及组] 传球游戏

#include<iostream> using namespace std; int n;// n个人传球游戏 默认开始球在编号为1的位置 int m;// 传递m次球 int main(){cin>>n>>m;// 动态转方程&#xff1a;// 球传递到编号为k人的手中// 种类总数 传递到k-1编号种类总数 传递到k1编号种类总数//…

wsl2 Ubuntu子系统内存只有一半的解决办法

物理机的内存是64G&#xff0c;在wsl2安装完Ubuntu20.04后&#xff0c;输入命令&#xff1a; free -g 发现只有32G&#xff0c;原因是默认只能获得物理机一半的内存&#xff1a; WSL 中的高级设置配置 | Microsoft Learn 因此可手动修改为与物理机同等大小&#xff1a; 1&a…

后端开发面经系列 -- 哔哩哔哩C++后端一面

B站C后端开发一面 公众号&#xff1a;阿Q技术站 来源&#xff1a;https://www.nowcoder.com/discuss/550638808786661376 1、MySQL默认16KB的页大小会不会有什么问题&#xff1f;为什么使用16KB作为页面的默认大小&#xff1f; MySQL默认的页大小&#xff08;或称为数据页、表…

【数据库】数据库为什么比电子表格快

为了更深入地了解SQL数据库用于加速查询的特定算法和机制&#xff0c;让我们关注索引和查询优化。与在CSV等平面文件中进行线性搜索相比&#xff0c;这些基本方面使数据库中的查询速度更快。 1。索引 数据库中的索引有点类似于书籍中的索引&#xff0c;它允许你快速定位特定的…

再拓信创版图-Smartbi Insight V11与东方国信CirroData数据库完成兼容适配认证

近日&#xff0c;思迈特商业智能与数据分析软件 [简称&#xff1a;Smartbi Insight] V11与北京东方国信科技股份有限公司 &#xff08;以下简称东方国信&#xff09;CirroData-OLAP分布式数据库V2.14.1完成兼容性测试。经双方严格测试&#xff0c;两款产品能够达到通用兼容性要…

i18next serverSideTranslations 的使用

i18next 是一个流行的国际化&#xff08;i18n&#xff09;库&#xff0c;它可以帮助应用程序中实现多语言支持。next-i18next 是 Next.js 中与 i18next 集成的官方插件&#xff0c;它提供了一种简单的方式来在 Next.js 应用程序中实现国际化。 serverSideTranslations 是 next…

PyTorch中的常见乘法运算(*、@、Mul、Matmul)

哈达玛积&#xff1a;torch.mul()、torch.dot()、* 两个相同尺寸的张量相乘&#xff0c;然后对应元素的相乘就是哈达玛积&#xff0c;这种乘法要求参与运算的矩阵唯独相同&#xff0c;运算结果还是一个相同维度的矩阵。在这个运算中&#xff0c;torch.mul()和*以及torch.dot()…