Unity之C#面试题(二)

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

Unity之C#面试题(二)
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 面试题

为面试者节省宝贵的学习时间,避免困惑!

p1

文章目录

  • 一、C# 委托和事件的区别?
  • 二、反射机制原理?
  • 三、面向对象的三大特性
    • 1、封装
    • 2、继承
    • 3、多态
  • 四、foreach迭代器遍历和for循环遍历的区别?
  • 五、string 和stringBuilder 的区别?
  • 六、using关键字的作用?
  • 七、面向对象设计原则


一、C# 委托和事件的区别?


委托本质是一个类,委托是存有对某个方法的引用的一种引用类型变量。它定义了方法的类型,使得可以将方法当作参数进行传递,并且以方法的形式执行。

事件是基于委托的,为委托提供了一个订阅和发布的机制,事件可以被看作是委托类型的一个变量,其本质是用来对委托类型的变量进行封装的,类似类的属性对字段的封装。

委托和事件的区别:

  1. 事件只能在方法的外部进行声明,而委托在方法的外部和内部都可以进行声明。
  2. 事件只能在类的内部进行触发,不能在类的外部进行触发。而委托在类的内部和外部都可以触发。
  3. 委托一般用于回调,而事件一般用于外部接口,在观察者模式中,被观察者可在内部声明一个事件作为外部观察者注册的接口。
  4. 委托可以使用=和+=将函数注册到委托的变量上,使用-=来将函数注销,而事件只有在自己的类中可以使用这三种符号,在外部只能使用+=和-=来注册和注销函数。
public delegate void Foo();public class Test{public Foo foo1;public event Foo foo2;public Test(){foo1 = Func;foo1 += Func;foo1();foo2 = Func;foo2 += Func;foo2();}public void Func(){ }}public class App{public App(){Test test = new Test();test.foo1 = Func;test.foo1 += Func;test.foo1();test.foo2 = Func;//这个会报错test.foo2 += Func;test.foo2();//这个会报错}public void Func(){}}


二、反射机制原理?


反射是.net中的重要机制,可以在运行时获得.net中每一个类型的成员包括方法、属性、事件、以及构造函数等,还可以获得每个成员的名称,限定符和参数等。反射提供了一种编程的方式,让程序员可以在程序运行期获得.net的组成的相关信息。

原理:

  • 主要依据元数据,元数据的表现形式是一种二进制信息,元数据将存储程序集(名称,版本等)、类的说明(名称、可见性、基类和实现的接口)、类的成员(方法、字段、属性、事件等),当执行代码的时候,运行库将元数据加载到内存中并通过引用元数据来发现有关代码的类、成员和继承等信息。

  • 元数据就是一大推的表,当编译程序集或模块时,编辑器会创建一个类定义表,字段定义表和方法定义表等,System.reflection命名空间包含的几个类允许你解析这些元数据表的代码。

  • 反射则是审查元数据并收集关于它的类型的信息的能力。

  • 反射提高了程序的灵活性和扩展性,降低耦合性提高自适应能力,允许程序创建和控制任何类的对象
    使用反射基本是一种解释操作,用于字段和方法接入时要远慢于直接代码。


三、面向对象的三大特性

1、封装

封装就是隐藏内部的具体实现,只保留和外部交流数据的接口,就好比电视机,用一个外壳把内部零部件及控制电路封装起来,只提供按钮或者遥控器接口供人使用。

  • 从设计角度来讲,封装可以对外屏蔽一些重要信息
  • 从安全性考虑,封装使对代码的修改更加安全和容易,封装明确指出哪些属性和方法是外部可以访问的
  • 封装还避免了命名冲突的问题,封装有隔离的作用,不同类中可以有相同的名称、方法和属性
    封装可以隐藏实现细节使得代码模块化

2、继承

使用继承而产生的类被称为派生类或子类,而被继承的类则称为基类或父类,继承表示一个类派生于一个基类,它拥有该基类的所有成员字段和函数,其子类是对父类的扩展。

  • 继承可以使用现有类的所有功能,并在无须重新编写原来类的情况下,对这些功能进行扩展。

  • 继承可以扩展已存在的代码模块,继承是实现代码重用、扩展的重要手段

3、多态

多态性是指多种行为,是同一个行为具有多个不同表现形式或形态的能力,多态性意味着有多重形式,在面向对象编程规范中,多态性往往表现为“一个接口,多个功能”,主要通过子类对父类方法的覆盖来实现多态,这样不同的对象可以用同名的方法完成特定的功能,但具体实现的方法却可以不同。同样的方法调用后执行不同的操作,运行不同的代码,在不同的类中有不同的体现。

实现多态的两种方式:重载和重写

重载: 允许你在同一个范围内对相同的函数名有多个定义,函数的定义必须彼此不同,可以是参数列表中的参数类型不同,也可以是参数的个数不同,不能重载只有返回类型不同的函数声明,对于这两个函数的调用,在编译器间就已经确定了,是静态的。

重写: 函数名和参数完全相同只不过内部实现不同,不能同时处于一个类的内部。
多态通过虚函数来实现,虚函数允许子类重新定义成员函数,子类重新定义父类的做法叫做重写,重写分为两种:直接重写成员函数和重写虚函数,只有重写了虚函数才能更好的体现多态。


四、foreach迭代器遍历和for循环遍历的区别?


  1. 从底层实现上;foreach是通过指针偏移实现的,每循环一次指针就偏移一个单位,而for循环是通过当前索引相对零索引的偏移量计算实际访问地址实现的
  2. 从编码结构上:foreach语句省去了for语句中设置循环起点和循环条件的过程
  3. 从使用要求上:使用foreach语句遍历对象要求对象类型实现了枚举接口IEnumerable
  4. foreach为只读循环,所以在循环的时候无法对数组或集合进行修改

foreach 遍历实现逻辑

能够进行foreach的集合或数组,都必须实现IEnumerable接口,并调用GetEnumerator方法返回IEnumerator遍历器,IEnumerator遍历器有MoveNext方法,当foreach遍历时,第一次会调用GetEnumeratorfa返回一个IEnumerator遍历器,之后每次循环都会调用MoveNext方法,直到循环结束。

List<string> list = new List<string>() { "25", "哈3", "26", "花朵" };
IEnumerator listEnumerator = list.GetEnumerator();
while (listEnumerator.MoveNext())
{Console.WriteLine(listEnumerator.Current);
}


五、string 和stringBuilder 的区别?


  • string 是不可变字符串,每次对字符串进行修改(赋值、拼接等)时,都会在内存中创建一个新的字符串对象,这就需要为该对象分配新的空间,会对系统的性能产生影响,不适合大量频繁的字符串拼接。

  • stringBuilder是可变字符串,每次操作都是对自身对象进行操作而不是生成新的对象,其所占空间会随着内容的增加而扩充,这样,在做大量的修改操作时,不会因生成大量对象而影响系统性能。

  • string功能性更强,通用性更好,用途更广泛。


六、using关键字的作用?


  1. 引用命名空间。
  2. 为命名空间或则类型创建别名。
  3. 资源的释放的作用范围:跳出using的作用的范围后就会被释放。

如果一个类实现了接口IDisposable,当这个类在using中创建的时候,using代码块会结束时自动调用这个类中实现了接口IDisposable中的Dispose方法。

using System;    //引用命名空间
using aClass = test1.MyClass; //创建别名
using bClass = test2.MyClass; //创建别名
using(分配资源)
{try{ 使用资源 }finally{ Resource.Dispose}
}


七、面向对象设计原则


  1. 开闭原则:
    对扩展开放,对修改关闭
    在不修改现有代码的基础上,去扩展新功能,开闭原则中的“开”是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”是指对于代码的修改是封闭的,即不应该修改原有的代码
  2. 单一职责原则:
    一个类应该专注于单一的功能
    如果把多个功能放在同一个类中,功能之间就形成了关联,改变其中的一个功能,有可能中止另一个功能
  3. 里氏代换原则:
    所有引用父类的地方都能够透明的引用其子类
    子类可以扩展父类的的功能,但不能改变父类原有的功能,子类可以实现父类的抽象方法,子类也可以增加自己特有的方法,但不能覆盖父类的非抽象方法。
  4. 依赖倒转原则:
    高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。依赖倒置原则就是要我们面向接口编程,理解了面向接口编程也就理解了依赖倒置
  5. 接口隔离原则:
    一个接口不需要提供太多的行为,一个接口应该尽量只提供一个对外的功能,让别人去选择需要实现什么样的行为,而不是把所有的行为都封装到一个接口中
  6. 迪米特原则:
    一个对象应该对其他对象保持最少的了解
    如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用,而是通过引入一个第三者发生间接交互
  7. 合成复用原则:
    尽量使用对象组合,而不是继承来达到复用的目的,继承是强耦合,组合是低耦合




TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

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

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

相关文章

langchain 文本向量化存储,并检索相似 topK

目录 chroma 检索 faiss 检索 检索器 相似性 最大相关性mmr 相似数阈值 txt 有多行&#xff0c;我的这份数据有 67 行&#xff0c;样例如下&#xff1a; 字段1\t值1\n 字段2\t值2\n ... chroma 检索 pip install langchain-chroma 在本地下载了 embedding 模型&…

SpringBoot 集成H2数据库,启动执行sql, 中文乱码

目录 H2数据库介绍 SpringBoot版本&#xff1a;SpringBoot 2.1.12.RELEASE 快速集成H2&#xff0c;maven依赖 快速集成H2&#xff0c;数据源及关键参数配置 spring.datasource.schema参数&#xff08;建表SQL脚本&#xff09; spring.datasource.data参数&#xff08;更新、…

Golang | Leetcode Golang题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; func removeNthFromEnd(head *ListNode, n int) *ListNode {dummy : &ListNode{0, head}first, second : head, dummyfor i : 0; i < n; i {first first.Next}for ; first ! nil; first first.Next {second second.Next}second.N…

Nacos-默认token.secret.key-配置不当权限绕过漏洞复现

漏洞描述&#xff1a; Nacos 身份认证绕过漏洞(QVD-2023-6271)&#xff0c;开源服务管理平台 Nacos在默认配置下未对 token.secret.key 进行修改&#xff0c;导致远程攻击者可以绕过密钥认证进入后台&#xff0c;造成系统受控等后果。 漏洞信息 公开时间&#xff1a;2023-03…

11 Php学习:函数

PHP 内建函数Array 函数 PHP Array 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。 创建 PHP 函数 当您需要在 PHP 中封装一段可重复使用的代码块时&#xff0c;可以使用函数。下面详细解释如何创建 PHP 函数并举例说明。 创建 PHP 函数的语法 PHP 函数的基…

生成式AI对UiPath来说是机遇还是挑战?

企业争相通过技术革新来领跑市场&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;技术更是将企业的效率和成本控制推向了新的高度。但当人工智能&#xff08;AI&#xff09;的最新进展——生成式AI登上舞台时&#xff0c;它不仅带来了变革的可能&#xff0c;还提出了一…

Vue3---基础2(component)

主要讲解 component 的创建 以及vue插件的安装 Vue.js Devtools 为谷歌浏览器的Vue插件&#xff0c;可以在调试工具内查看组件的数据等 下载 有两种下载方式 1. 谷歌应用商店 打开Chrome应用商店去下载&#xff0c;这个方法需要魔法 2. 极简插件 极简插件官网_Chrome插件下载_…

[C++][算法基础]n-皇后问题(DFS)

n−皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n&#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包含整数 n。 输出…

APP开发教学:开发同城O2O外卖跑腿系统源码详解

同城O2O外卖跑腿系统&#xff0c;满足了人们对于外卖送餐和生活服务的需求。今天&#xff0c;小编将为您讲解如何开发同城O2O外卖跑腿系统源码。 1.前期准备 首先&#xff0c;我们需要明确系统的功能需求和用户需求&#xff0c;包括外卖订购、配送员接单、支付功能等。其次&am…

minio-docker单节点部署SDK测试文件上传下载

目录 一&#xff0c;docker部署minio单节点单磁盘 二&#xff0c;SDK测试上传下载 一&#xff0c;docker部署minio单节点单磁盘 1.拉取镜像 # 下载镜像 docker pull minio/minio 2.查看镜像 docker images 3.启动minio(新版本) 创建本机上的挂载目录&#xff0c;这个可以…

NetSuite 销售订单页面选择客户后停滞问题研究

随着用户环境中定制内容的增加&#xff0c;用户会发现Sales Order中选择Customer时的页面停滞时间会变长。这让用户感到很疑惑。 我们初步研究了一下这个问题&#xff0c;两个变量比较显著&#xff1a; •Form的页签数量•脚本的挂载数量 试验数据 1. 多页签&#xff0c;无…

潍微科技-水务信息管理平台 ChangePwd SQL注入漏洞复现(CNVD-2024-14945)

0x01 产品简介 水务信息管理平台主要帮助水务企业实现水质状态监测、管网运行监控、水厂安全保障、用水实时监控以及排放有效监管,确保居民安全稳定用水、环境有效保护,全面提升水务管理效率。由山东潍微科技股份有限公司研发,近年来,公司全力拓展提升水务、水利信息化业务…

nginx工作原理解析

目录 1、master-workers 的工作机制介绍 2、master-workers 的机制的好处 3、设置多少个 worker 4、最大连接数和支持的最大并发数的计算 1、master-workers 的工作机制介绍 nginx在启动后&#xff0c;会有一个master进程和一个或者多个相互独立的worker进程 过来的请求由…

数字化时代:IT界的致富秘籍 —— 策略×态度×机遇

&#x1f31f; 数字化时代&#xff1a;IT界的致富秘籍&#x1f680; —— 策略态度机遇 在数字化浪潮中冲浪&#x1f3c4;‍♂️&#xff0c;IT行业犹如一片无限可能的蓝海。想要在这片汹涌的海洋中捕获财富&#xff0c;不是一件轻而易举的事。让我们一起深入探索&#xff0c;如…

对给定向量旋转

对给定向量旋转 顺时针&#xff1a; 逆时针&#xff1a; 源码&#xff1a; QPointF rotateVector(const QPointF& dir, double angle, bool flag){double rad (angle * M_PI) / 180;QPointF res;if (flag){float x static_cast<float>(dir.x() * std::cos(rad) …

【前端】layui table表格勾选事件,以及常见模块

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《前端》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 表格勾选事…

面试-数据库基础以及MySql、ClickHost、Redis简介

面试-数据库基础以及MySql、ClickHost、Redis简介 0.数据完整性1.数据库并发控制1.1事物1.2 并发读写错误1.3 锁1.3.1 乐观锁与悲观锁1.3.2 共享锁和排他锁1.3.3 行锁与表锁1.3.4 意向锁 1.4 封锁协议与隔离级别1.5 MVCC1.5.1 概念1.5.2 当前读与快照读1.5.3 MVCC in InnoDB 2.…

pytest常用钩子函数

1、什么叫钩子函数 在Pytest框架中&#xff0c;钩子函数是一种允许用户扩展或者自定义测试执行过程的机制。钩子函数允许用户在测试的不同阶段插入自定义的代码&#xff0c;以实现特定的行为&#xff0c;操作或处理。这种插入式的机制使得Pytest具有高度的灵活性和扩展性。 如…

Linux软件包管理器yum—5

一、Linux下软件安装的方式 ①源代码安装&#xff1a; ②rmp包安装&#xff1a; 本质是拷贝可执行程序到系统目录下。 ③yum一键下载&#xff0c;安装&#xff0c;卸载。相当于手机的应用商店。 二、yum 2.1查看yum已配置的源&#xff1a; ls /etc/yum.repos.d/ 2.2查看yum…

环信 IM 客户端将适配鸿蒙 HarmonyOS

自华为推出了自主研发操作系统鸿蒙 HarmonyOS 后&#xff0c;国内许多应用软件开始陆续全面兼容和接入鸿蒙操作系统。环信 IM 客户端计划将全面适配统鸿蒙 HarmonyOS &#xff0c;助力开发者快速实现社交娱乐、语聊房、在线教育、智能硬件、社交电商、在线金融、线上医疗等广泛…