之前秋招的时候有很多小伙伴挂在了技术面上,想找一些面试题的分析贴加强自己的技术,所以本篇,我汇总了之前参加大厂招聘后的真实面试题,以及参加大佬模拟面试中涉及到一些问题,构成本篇文章。

希望能给即将参加来年面试的你增加一些经验。

一、C# 语言和面向对象 OOP

1、【重点面试题】面向对象的三大特性

封装 :隐藏对象的属性,并实现细节(方法),对外提供接口,

public 全局,protected 子类,internal 同集,隐藏 private

同类,public 属性器,private 字段,对赋值进行限定。

sealed 修饰符的子类是不能被继承的。

**继承:**重用现有代码

**多态:**静态多态重载,动态多态重写。

父类行为由子类具体实现,包含 virtual 虚方法,abstract 抽象方法,interface 接口

可以涉及题目虚方法、抽象方法、接口的区别

重载和重写区别

静态重载:返回值无关,与参数个数,类型相关。编译阶段。便于扩展和维护

动态重写 override(运行时,改写了方法表的新地址)。

抽象方法的父类必须是抽象类,子类是抽象类可以不重写,抽象类不可以被实例化。

举例子非常重要

基类抽象人物工厂(接口), 子类具体玩家工厂,子类怪物工厂,子类 npc 工厂,抽象产品(接口)具体魔法师,弓箭手产品~

资源管理工厂,UI 资源管理工厂,音频资源管理工厂,资源管理,UI 资源管理,音频资源

点击小卡片免费领取海量 U3D 资源 / 面试攻略 / 简历模版

2、【重点面试题】值类型和引用类型区别

值类型:包含了所有简单类型(整数、浮点、bool、char)、struct、enum。

继承自 System.ValueTyoe

引用类型包含了 string,object,class,interface,delegate,array

继承自 System.Object

内存区域上的区别

值类型:数据存储在栈上,超出作用域就自动清理

引用类型:数据存储在托管堆上,引用地址在线程栈上,地址指向数据存放的堆上

托管堆会由 GC 来自动释放 ,线程栈数据在作用域结束后会被清理。 00000000000000 拷贝策略:值类型是拷贝数据,引用类型是拷贝引用地址

如果值类型为传值参数,传值参数会在栈上新开辟一个副本,原先的值类型数据不会改变

如果引用类型是传值参数,传值参数会创建一个新的引用地址,两个引用地址会指向同一个对象实例的数据,实例数据会随着改变进行改变。(这种行为被称为副作用,一般实际项目不会这么操作,要么 return 返回参数,要么使用 ref 或者 out 修饰符)

【扩展 Ref 引用参数,Out 输出参数可以利用这一副作用机制】

通常来讲 变量的值分配 与其声明该变量的位置有关。 局部变量的值 总是在 栈上的。 实例变量的值则和实例本身一起储存在实例储存的地方。 引用类型实例和静态总是储存在 堆上的。

数组的元素、引用类型中的值类型字段等,引用类型的确总是分配在托管堆上, 但是值类型并非总是分配在线程栈上有可能分配在堆上。

值类型和引用类型互相转换:拆箱和装箱

装箱:值类型 ====》引用类型 object

  1. 分配内存堆

  2. 值类型数据拷贝到新的内存堆中

  3. 栈中分配一个新的引用地址指向内存堆

拆箱:引用类型 object====》值类型

  1. 检查确保对象是给定值类型的一个装箱值

  2. 将该值数据复制到栈中的值类型

string 是特殊的引用类型,如果传入参数是 string,在方法里修改,原 string 数值不变。

原因是 string 的不变性,系统内部做了特殊处理。

【重点面试题】3、装箱和拆箱的区别

值类型和引用类型的最终基类是 Object

装箱:值类型转换成引用类型的过程,生成新的引用

拆箱;引用类型转换成值类型的过程

装箱操作:托管堆分配内存,值类型拷贝数据,object 地址指向托管堆对象

拆箱操作:根据 object 引用地址找到托管堆上的数据,栈上数据拷贝

避免装箱操作,生成新的应用,解决办法就是第一是重载,第二是泛型

4、public、private、protected、internal、sealed 的区别

public 全局、private 类内部、protected 派生类、internal 本程序集

sealed 声明类就不能继承,声明方法就是不能被重写

点击小卡片免费领取海量 U3D 资源 / 面试攻略 / 简历模版

【重点面试题】5、什么是接口,描述一下接口的成员具体实现(手撸代码和注意修饰符)

接口 interface,不能定义字段,可以定义【非静态的】属性、索引器、事件、方法

默认 public,但不能写任何访问修饰符

接口是引用类型,可以通过 as 运算符强转,获取某对象的接口的引用

接口可以继承 N 个接口,继承类要实现所有接口的方法

声明接口 IA > 继承接口的类 B > 类 B 实现接口所有方法

接口要小而精,定义一组方法,继承接口的派生类要实现接口的所有方法。

接口和抽象类是不能被实例化的对象(引用类型)。

举个例子:游戏门:抽象类,不能实例,很多行为,定义接口,破坏可以击碎 系统接口鼠标行为,停留进入离开 很多设计模式,是对接口的应用,面向接口编程,实现层面更加有层次。 【参考 C# 图解第十五章接口】

其实对于面试,如果是技术问题,那就还需要你自己多多加强技术,但有些情况可能不在你身上,只是其恰巧运气不好。

我在找到理想的工作之前,面试了有几十场,每次面试也会出现不同的新情况,慢慢从中有了些感悟,也借此和大家分享下。

首先面试归根结底是一个看候选人与面试官是否有缘分的事情,因为面试面得多了,很自然就会发现一些潜在的规律,(例如你的预期薪水不符合面试岗位所给到的薪水,你的一些非技术向观点与面试官已有观点冲突…),当出现上述情况时,大概率你是不会通过这场面试的,就抱着和面试官随便聊聊的心态沟通就行了。

正常和面试官沟通完技术向相关问题时,通过面试官收尾时邀请你提出反问问题的语气与态度也很容易就能判断出来他对你本场面试表现的一个态度,很轻松就能判断出你是否能走接下来的流程。常见的若面试官开始告诉像这样的话语:

  • “你过来可以先跟着 XXXX,后 XXXX”.
  • “可以,我就喜欢你们年轻人 XXXX,你可以过来 XXXXX”.
  • 等等等等。即给你安排未来的工作与表达对你当前阶段态度或是能力的认可。

把握这一步的态度很关键,如果你有把握对方对你本次的面试表现很满意,那么在人事谈薪环节你也能拥有主动权,提出平均线以上的水准,若对方表现很想要你,同时你对你本场表现很满意,也看得出来对方很满意,那么在表达礼貌的同时可以尝试提出当前岗位 JD 的顶薪。

本次分享就到这里,之后我也会就自己的一些经验和感悟和大家再做分享。

为了有游戏开发梦想的伙伴能多多交流,我开设了 Unity 游戏开发交流群,让你第一时间掌握关于技术、行业资讯、发展详情等讯息,还有更多 Unity 游戏开发大厂面试题。

如果你还不知道自己是否具备进入游戏开发行业能力的话,我也为大家准备了 U3D 工程师技能架构图、简历自测评分表等诸多免费福利,点击下方小卡片就可以免费领取。

点击小卡片免费领取海量 U3D 资源 / 面试攻略 / 简历模版