【Unity】面试题

第一部分
1. 请简述值类型与引用类型的区别
1.值类型存储在内存栈中,引用类型数据存储在内存堆中,实际存放的是内存堆中对象的地址。
2.值类型存取快,引用类型存取慢。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用。
4.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放。
5.值类型继承自System.ValueType(它的父类是System.Object),引用类型继承自System.Object。

2.C#中所有引用类型的基类是什么
引用类型的基类是System.Object 值类型的基类是System.ValueType
同时,值类型也隐式继承自System.Object

3.请简述ArrayList和List的主要区别
ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理)
装箱拆箱的操作(费时)
IList是接口,AIrrayList和List都是实现了该接口的类,可以被实例化。

4.请简述GC(垃圾回收)产生的原因,并描述如何避免?
GC回收堆上的内存
避免:
1)减少new产生对象的次数
2)使用公用的对象(静态成员),但是静态对象会一直存在,直到退出程序
3)将String换为StringBuilder

5.请描述Interface与抽象类之间的不同
接口中所有的方法都不能有实现,并且不能指定方法的修饰符
    抽象类中可以有方法的实现,也可以指定方法的访问修饰符
    第一个继承接口的类必须实现接口里的所有方法
    而抽象类中抽象方法的实现是由第一个非抽象的派生类来实现的
也就是说,如果抽象类的子类还是派生类那么是可以不实现父类中的抽象方法的

6.下列代码在运行中会产生几个临时对象?

首先,第1行代码的构造函数在C#程序中会出现错误,因为没有字符串类型的构造函数重载,所以严格的说可以说无法创建对象,但是出题者显然是忽略掉了这个问题,因为在Java中是可以创建的,所以回答的时候可以说明情况再进行作答。如果是在Java中,第1行会产生2个对象,分别是a和“abc”,第2行中会产生另外一个新的对象,所以一共会产生3个对象。

7.下列代码在运行中会发生什么问题?如何避免?

会产生运行时的错误,因为foreach是只读的,不能修改被遍历的对象中的数据

8.请简述关键字Sealed用在类声明和函数声明时的作用
修饰类时可防止其他类继承此类
修饰方法时则可防止派生类重写此方法

9.请简述private,public,protected,internal的区别
public:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:对该类和其派生类公开
internal:只能在包含该类的程序集中访问该类
protected internal:protected + internal,表示当前程序集或者其子类可以访问。注意是 protected 和 internal 是或者的关系。

10.反射的实现原理?
反射是审查元数据并收集关于它的类型信息的能力
1.using System.Reflection;
2.Assembly.Load(“程序集”)加载程序集,返回类型是一个Assembly
3. foreach (Type type in assembly.GetTypes())
            {
                string t = type.Name;
            }
   得到程序集中所有类的名称

  1. .Net与Mono的关系?
    Mono是.Net的一个开源跨平台工具,就类似java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.Net只能在windows下运行,Mono可以实现跨平台跑,
    可以运行于Linux,Unix,Mac OS等。

12.简述unity3d支持的作为脚本的语言的名称
Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。
Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。
(语言1)C#:官方曾经统计C#语言的使用率在80%以上,Boo语言的使用只用0.4%,也是被取消的原因之一
(语言2)JavaScript:和网页中常用的JavaScript不一样,它编译后的运行速度很快,语法方面也会有不少区别。
(语言3)Boo(Unity5.0的时候取消了对该语言的支持):可以看做是Python语言的变种,又糅合了Ruby和C#的特性,它是静态类型语言

13.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread(C#中的,不属于Unity),否则使用协同程序。
注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象

14.Unity3D的协程和C#线程之间的区别是什么?
多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜 Asynchronous同步。 

15.U3D中用于记录节点空间几何信息的组件名称,及其父类名称
组件是Transform ,它的父类是 Component

16.简述四元数的作用,四元数对欧拉角的优点?
四元数用于表示旋转
相对欧拉角的优点:
1)能进行增量旋转
2)避免万向锁
3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)

17.向量的点乘、叉乘以及归一化的意义?
点乘(Dot Product)
      如果说加法是凭直觉就可以知道的,另外还有一些运算就不是那么明显的,比如点乘和叉乘。
      点乘比较简单,是相应元素的乘积的和:
      V1( x1, y1)   V2(x2, y2) = x1*x2 + y1*y2
      注意结果不是一个向量,而是一个标量(Scalar)。点乘有什么用呢,我们有:
      A   B = |A||B|Cos(θ)
      θ是向量A和向量B见的夹角。这里|A|我们称为向量A的模(norm),也就是A的长度, 在二维空间中就是|A| = sqrt(x2+y2)。这样我们就和容易计算两条线的夹角:    Cos(θ) = AB /(|A||B|)
      当然你知道要用一下反余弦函数acos()啦。(回忆一下cos(90)=0 和cos(0) = 1还是有好处的,希望你没有忘记。)这可以告诉我们如果点乘的结果,简称点积,为0的话就表示这两个向量垂直。当两向量平行时,点积有最大值
      另外,点乘运算不仅限于2维空间,他可以推广到任意维空间。(译注:不少人对量子力学中的高维空间无法理解,其实如果你不要试图在视觉上想象高维空间,而仅仅把它看成三维空间在数学上的推广,那么就好理解了)
叉乘(cross product)
      相对于点乘,叉乘可能更有用吧。2维空间中的叉乘是:
      V1(x1, y1) X V2(x2, y2) = x1y2 – y1x2
      看起来像个标量,事实上叉乘的结果是个向量,方向在z轴上。上述结果是它的模。在二维空间里,让我们暂时忽略它的方向,将结果看成一个向量,那么这个结果类似于上述的点积,我们有:
    A x B = |A||B|Sin(θ)

      然而角度 θ和上面点乘的角度有一点点不同,他是有正负的,是指从A到B的角度。因此 ,向量的外积不遵守乘法交换率,因为向量a×向量b=-向量b×向量a在物理学中,已知力与力臂求外积,就是向量的外积,即叉乘。
      向量c的方向与a,b所在的平面垂直,且方向要用“右手法则”判断。判断方法如下:
1.右手手掌张开,四指并拢,大拇指垂直于四指指向的方向;
2.伸出右手,四指弯曲,四指与A旋转到B方向一致,那么大拇指指向为C向量的方向。

另外还有一个有用的特征那就是叉积的绝对值就是A和B为两边说形成的平行四边形的面积。也就是AB所包围三角形面积的两倍。在计算面积时,我们要经常用到叉积

标准化向量:用在只关系方向,不关心大小的时候,标准化向量不改变向量的方向,只是将向量的大小变为1

18.矩阵相乘的意义及注意点
用于表示线性变换:旋转、缩放、投影、平移、仿射
注意矩阵的蠕变:误差的积累

19.为何大家都在移动设备上寻求U3D原生GUI的替代方案
OnGUI很耗费时间(每帧调用2次,频率是Update的2倍),使用不方便 ,DrawCall更高

20.请简述如何在不同分辨率下保持UI的一致性
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。
UGUI中,CanvansScaler中的UI Scale Mode可以选择支持UI的适配方式

21.为什么dynamic font在unicode环境下优于static font
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。 当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。

22.Render的作用?描述MeshRender和SkinnedMeshRender的关系与不同
Mesh 就是指模型的网格(同名组件是用于调整网格属性的), MeshFilter 一般是用于获得模型网格的组件,而 MeshRender 是用于把网格渲染出来的组件。
SkinnedMeshRender:蒙皮网格用于渲染人物, 当导入有蒙皮的网格时,骨骼蒙皮渲染器会自动添加到导入的网格。

23.简述SkinnedMesh的实现原理
原理比较复杂,类似的面试题很少出现,仅供了解参考 http://blog.csdn.net/n5/article/details/3105872

24.在场景中放置多个Camera并同时处于活动状态会发生什么?
实际看到的画面由多个camera的画面组成,由depth、Clear Flag、Culling Mask都会影响最终合成效果。

25.Prefab的作用?如何在移动环境的设备下恰当地使用它?
在游戏运行时实例化,prefab相当于一个模版,对你已有的素材、脚本、参数做一个默认配置,以便于以后修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。

26.如何销毁一个UnityEngine.Object及其子类
Destory(自身游戏对象); 会销毁自身及其所有的子物体

27.为什么Unity3D中会发生在组件上出现数据丢失的情况?
组件上绑定的对象被删除了,如果UI组件作为预制体并且添加了监听事件,那么生成之后,监听事件会消失

28.如何安全的在不同工程间安全地迁移asset数据?三种方法
1.将Assets目录和Library目录一起迁移
2.导出包
3.用unity自带的assets Server功能

29.MeshCollider和其他Collider的一个主要不同点?
Meshcollider是基于Vector3顶点, collider本身是基于算法,没有面的概念

30.当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
穿透(碰撞检测失败)
解决方法:
1. 增大细小物体的碰撞体
2. 使用射线检测
3. 可以physics time减小,不建议这样做
4. 确保rigidbody不超过一定的速度,这个也不实用
31.OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
Awake —>OnEnable—>Start
OnEnable在同一周期中可以反复地发生

32.请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。 但是在编辑器状态下,Scene视图中摄像机是否能看到游戏对象,也会触发这两个回调函数

33.Unity3D 中动态加载资源有几种方法,分别是什么?

 通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。
 通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。
 通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的

34.MeshRender中material和sharedmaterial的区别?
修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。
不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。

第二部分
1. 请描述游戏动画有哪几种,以及其原理。
主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。
关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画。
单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。(骨骼动画是由关节动画发展而来的,如今基本都使用骨骼动画来实现角色动画)

  1. alpha blend 工作原理
    实际显示颜色 = 前景颜色Alpha/255 + 背景颜色(255-Alpha)/255

  2. 写光照计算中的diffuse的计算公式(频率较低)
    实际光照强度 I= 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular);
    环境光:Iambient= Aintensity* Acolor; (Aintensity表示环境光强度,Acolor表示环境光颜色)
    漫反射光:Idiffuse = Dintensity*Dcolor*N.L;
    (Dintensity表示漫反射强度,Dcolor表示漫反射光颜色,N为该点的法向量,L为光源向量)
    镜面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;
    (Sintensity表示镜面光照强度,Scolor表示镜面光颜色,R为光的反射向量,V为观察者向量,n称为镜面光指数)

  3. lod是什么,优缺点是什么
    LOD技术即Levels of Detail的简称,意为多细节层次。LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
    优点:可根据距离动态地选择渲染不同细节的模型
    缺点:加重美工的负担,要准备不同细节的同一模型,同样的会稍微增加游戏的容量。

  4. 两种阴影判断的方法工作原理(面试题出现过,几乎没人问)
    阴影由两部分组成:本影与半影
    本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)
    半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
    求阴影区域的方法:做两次消隐过程
    一次对每个光源进行消隐,求出对于光源而言不可见的区域L;
    一次对视点的位置进行消隐,求出对于视点而言可见的面S;
    shadow area= L ∩ S
    阴影分为两种:自身阴影和投射阴影
    自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面
    工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。
    投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域受不到光照照射而形成的阴影
    工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
    若是动态光源此方法就无效了。

5.Vertex Shader是什么?怎么计算?
顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。
Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。

  1. MipMap是什么?作用?
    在三维计算机图形的贴图渲染中有一个常用的技术被称为Mipmapping。为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap。

  2. 用u3d实现2d游戏,有几种方式?
     1.利用引擎自带的GUI
      2.把摄像机设为Orthographic,用面片作为2d元素
      3.利用第三方插件:NGUI、2dToolkit

  3. u3d中碰撞器和触发器的区别?
    collider碰撞器会有碰撞的效果,IsTrigger = false,可以调用OnCollisionEnter/Stay/Exit函数
    trigger触发器没有碰撞效果,isTrigger = true,可以调用OnTriggerEnter/stay/exit函数

  4. 物体发生碰撞的必要条件
    两个物体都有碰撞器,运动的物体必须带有刚体

  5. CharacterController(第一人称控制器)和Rigidbody的区别
    Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的Rigidbody,具有一定的物理效果但不是完全真实的。

  6. 物体发生碰撞时,有几个阶段,分别对应的函数
    三个阶段,OnCollisionEnter/Stay/Exit函数

  7. u3d中,几种施加力的方式,描述出来。
    rigidbody.AddForce/AddForceAtPosition,都是rigidbody的成员函数

  8. 什么叫做链条关节
    Hinge Joint ,他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。(简单说就是弹簧)

  9. 物体自旋转使用的函数叫什么
       transform.Rotate

  10. 物体绕某点旋转使用函数叫什么
    transform.RotateAround

  11. u3d提供了一个用于保存读取数据的类,(playerPrefs),请列出保存读取整形数据的函数
    PlayerPrefs.SetInt 与 PlayerPrefs.GetInt

  12. unity3d提供了几种光源,分别是什么
    平行光:Directional Light
    聚光灯:Spot Light
    点光源:Point Light
    区域光源:Area Light(只用于烘培)

  13. unity3d从唤醒到销毁有一段生命周期,请列出系统自己调用的几个重要方法。
    Awake –>OnEnable –> Start  –> FixedUpdate –>Update –>LateUpdate –> OnGUI –>OnDisable –> OnDestroy

  14. 物理更新一般在哪个系统函数里?
    FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。

  15. 移动相机动作在哪个函数里,为什么在这个函数里。
    LateUpdate,,是在所有update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

  16. 当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存。
    做一个对象池,游戏开始时预先实例化足够的数量,然后用的时候取不用的时候收回

  17. 一个场景放置多个camera并同时处于活动状态,会发生什么
    实际看到的画面由多个camera的画面组成,由depth、Clear Flag、Culling Mask都会影响最终合成效果。 
    第三部分
    1. 什么是渲染管道?
    是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
    主要步骤有:
    本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。

2. 如何优化内存?
有很多种方式,例如
1.压缩自带类库;
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
3.释放AssetBundle占用的资源;
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。

3、什么是协同程序?
Unity用来模拟多线程的手段,在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个“线程”。可以用来控制运动、序列以及对象的行为。

4、你用过哪些插件?
  NGUI、EasyTouch & EasyJoystick、FX Maker、Playmaker
DoTween、UnIDE 、Tile Based Map and Nav、Toon shader

第四部分
1. 反向旋转动画的方法是什么?
反转动画,将动画的速度调到-1,改变animation.speed

  1. 实现吊机吊物体的功能
    用代码实现,吊车吊物体的情景,提示使用碰撞或触发事件

3.获取、增加、删除组件的命令分别是什么?
获取:GetComponent
增加:AddComponent
删除:Destroy

4.Animation.CrossFade命令作用是
动画的淡入为其他动画

5.调试记录到控制台的命令是什么?
Debug.Log();

6.编辑器类存放路径是什么?
工程目录下的Assets/Editor文件夹下。

7.使用原生GUI创建一个可以拖动的窗口命令是什么?
 GUI.DragWindow();

8.localPosition与Position的使用区别?
localPosition:自身位置,相对于父级的变换的位置。 
Position:在世界坐标transform的位置
9.写一个计时器工具,从整点开始计时,格式为:00:00:00
using UnityEngine;
using System.Collections;
public class MyTime : MonoBehaviour
{
    private float timer = 0f;
    private int h = 0;
    private int m = 0;
    private int s = 0;
    private string timeStr = string.Empty;
  
    void Update ()
    {
        timer += Time.deltaTime;
        if (timer >= 1f) {
            s++;
            timer = 0;
        }
        if (s >= 60) {
            m++;
            s = 0;
        }
        if (m >= 60) {
            h++;
            m = 0;
        }
        if (h >= 99) {
            h = 0;
        }
    }

    void OnGUI ()
    {
        timeStr = string.Format (“{0:D2}:{1:D2}:{2:D2}”, h, m, s);
        GUI.Label (new Rect (10, 10, 100, 200), timeStr);
    }

}
10.写出Animation的五个方法
Animation.Play
Animation.CrossFade
Animation.Stop
Animation.Sample
Animation.AddClip

11.怎么拿到一个对象上脚本的方法
GameObject.GetComponent();

第五部分
1.在类的构造函数前加上static会报什么错?为什么?
构造函数格式为 public+类名如果加上static会报错(静态构造函数不能有访问修饰符)
原因:静态构造函数不允许访问修饰符,也不接受任何参数; 
无论创建多少类型的对象,静态构造函数只执行一次; 
运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数; 
静态构造函数执行先于任何实例级别的构造函数; 
显然也就无法使用this和base来调用构造函数。

  1. C# String类型比stringBuilder类型的优势是什么?
    如果是处理字符串的话,用string中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而stringBuilder是在原来的内存里对字符串进行修改,所以在字符串处理方面还是建议用stringBuilder这样比较节约内存。但是string 类的方法和功能仍然还是比stringBuilder类要强。
    string类由于具有不可变性(即对一个string对象进行任何更改时,其实都是创建另外一个string类的对象),所以当需要频繁的对一个string类对象进行更改的时候,建议使用StringBuilder类,StringBuilder类的原理是首先在内存中开辟一定大小的内存空间,当对此StringBuilder类对象进行更改时,如果内存空间大小不够,会对此内存空间进行扩充,而不是重新创建一个对象,这样如果对一个字符串对象进行频繁操作的时候,不会造成过多的内存浪费,其实本质上并没有很大区别,都是用来存储和操作字符串的,唯一的区别就在于性能上。
    String主要用于公共API,通用性好、用途广泛、读取性能高、占用内存小。
    StringBuilder主要用于拼接String,修改性能好。
    不过现在的编译器已经把 String 的 + 操作优化成 StringBuilder 了,所以一般用String就可以了
    String是不可变的,所以天然线程同步。
    StringBuilder可变,非线程同步。

3.C# 函数Func(string a, string b)用Lambda表达式怎么写?
public delegate string Del (string a);
Del del = (string a) => {
            return “返回值为字符串b”;
   };

4.数列1,1,2,3,5,8,13…第n位数是多少?用C#递归算法实现
public  int  recursion (int n)
    {
        if (n == 0) {
            return 0;
        } 
        if (n == 1 || n == 2) {
            return 1;
        }

        return recursion (n - 1) + recursion (n - 2);    
    }

5.<愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法.
 Vector3 v代表初速度v’代表现在的速度,假设小鸟是沿的z轴也就是transform.forward方向运动的质量为1,那么v‘=v-new Vector3(0,g*t,f*t),transform.Translate(v’)做的就是抛物线运动(g为重力加速度不要用现实中的需要自己调试,f为阻力也要自己调试设置,t为时间)
 

第六部分
1.C#中类是否支持多继承?请说明原因。
答:不支持,需要用接口来实现多继承

2.我们都知道一个类可以有多个构造函数,并且C#会在我们创建类的时候默认的提供一个无参的构造函数,当我实现了另外一个有参数的构造函数的时候,我还能调用无参数的构造函数吗?请说明原因。
答:不能,因为一旦你实现了一个构造函数,C#就不会再提供默认的构造函 数了,所以需要自己手动写入一个无参数的构造函数。

3.请简略描述重载和重写的区别?
答:方法重载提供了一个相同的方法但是方法签名的参数不同的调用的实现。
      重写提供了子类中改变父类方法行为的实现。

4.请问能设置类A可被继承,但类A中的某个方法不能被重写吗?
答:能,将类A的修饰符标记为public、标记类A中的不允许重写的方法为sealed
sealed关键字不仅可以限制类,也可以限制方法。

5.const和readonly有什么区别?
答:const关键字用来声明编译时的常量
      readonly用来声明运行时的常量

6.什么时候必须声明一个类为抽象类?
答:(1)当这个类中有抽象方法的时候,必须声明类为抽象类
       (2)该类没有完全实现父类的抽象方法时,也需要声明为抽象类

7.接口和抽象类的区别是什么?
答:接口中所有的方法都不能有实现,并且不能指定方法的修饰符
    抽象类中可以有方法的实现,也可以指定方法的访问修饰符
    第一个继承接口的类必须实现接口里的所有方法
    而抽象类中抽象方法的实现是由第一个非抽象的派生类来实现

8.类的私有成员会被子类继承吗?请说明原因。
答:会被子类继承,但是不能被访问。所以看上去是不能被继承的,实际上确实被继承了。

9.请写出C#中的单例模式
    答:
  public class Single
    {
        private static Single instance;
        private Single (){}
        public static Single GetInstance ()
        {
            if (instance == null) {
                instance = new Single ();
            }
            return instance;
        }
    }

10.现有一个整数number,请写一个方法判断这个整数是否是2的N次方
答:
private static bool GetFlag(int num)
        {
        if (num < 1) return false;
        return (num & num - 1) == 0;
     }

猜你喜欢

转载自blog.csdn.net/yangwenjie16/article/details/79986513