面试题-客户端开发

  • 1.protected、internal、public、private

protected:本类和子类访问
internal:内部访问,只在一个项目中访问
public:公有访问,所有类均可使用
private:只有当前类可以
protected internal:protected和internal的并集
1、修饰符号是internal表明在当前命名空间内可以实现对类的调用。
2、当类的修饰符是public时,该类不仅在当前命名空间可以被调用,在其它命名空间也可以被调用。任何程序集都可以去调用到它。

  • 2.C#的容器

ArrayList、List<T>
HashTable(哈希表)、Dictionary<T,T>
Queue、Queue,先进先出
Stack、Stack,先进后出
HashSet类,集合运算,求交集、并集、差集等。存储结构都与哈希表相同,主要是设计用来做高性能集运算的,集合中包含一组不重复出现且无特定顺序的元素。

  • 3.string stringBuilder:String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,开辟了一块新的内存空间,浪费内存。而stringBuilder是开辟一块空间,其内部维护的是一块在创建时就分配好的内存空间,只有当原有的内存空间不够时才会重新分配更大的内存空间。

-String主要用于公共API,通用性好,用途广泛,读取性能高,占用内存小。
-StringBuilder主要要用于拼接String,修改性能好。

  • 4.怎么判断两个平面是否相交?不能用碰撞体,说出计算方法

-获得两平面的法线,叉积后为Vector3.Zero,即为平行向量

Vector3 cross= Vector3.Cross(P1.up, P2.up);
 if (cross != Vector3.zero)
     Debug.Log("相交");
 else
     Debug.Log("不相交");
  • 5.二叉树四种遍历方法

递归
递归算法

public void TravelNode(TreeNode node)
{
	if(node==null)
		return;
	//前序遍历,根节点-左边左节点-左边的右节点-右边的左节点-右边的右节点
	Debug.Log(node.data);
	TravelNode(node.leftChild);
	TravelNode(node.rightChild);
	
	//中序遍历,先访问左节点,再访问根节点,最后访问右节点,
	TravelNode(node.leftChild);
	Debug.Log(node.data);
	TravelNode(node.rightChild);

	//后序先访问左节点,再访问右节点,最后访问根节点。
	TravelNode(node.leftChild);
	TravelNode(node.rightChild);
	Debug.Log(node.data);
}
  • 6.结构体和类

-结构体是值类型,类是引用类型
(值类型,数据存储在数据栈中。)
(引用类型(reference type):string 和 class统称为引用类型。当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。)
-结构体无法继承,类可以继承
-结构体中声明的字段无法赋予初值,类可以
类的对象是存储在堆空间中,结构存储在栈中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。

  • 7.使用递归计算斐波那契数列1,1,2,3,5,8,13…第n位数是多少

public int Fbnq(int n)
{
	if (n < 3)
		return 1;
	return Fbnq(n - 1) + Fbnq(n - 2);
}
  • 8.重写和重载

-重写:子类根据自己的需求重写父类的方法,只有virtual方法和抽象类方法可以override重写,但必须是相同的函数名、参数列表和返回值
-重载:相同的函数名,但参数类型和返回值至少一种不一样

  • 9.Array和List的内存空间

-Array是一段连续的存储结构,数组必须要在初始化时分配固定的大小,数组下标索引,是在首地址的基础上加上下标整数的偏移量来获得地址中的值
-List是不连续的存储结构,每一个数据都有next属性,这个属性则记录着他的下一个节点的地址。在Insert和Remove时需要从头遍历到目标位置后再进行
-数组是存储是连续的,但可以通过下标随机访问(任意访问),访问的空间复杂度为O(1);
-List是存储是随机的,但访问必须是连续的,访问的空间复杂度是O(n)
-List的插入删除分情况而定,如果需要查找元素并插入/删除,则时间复杂度O(n),如果已知目标节点的地址node,则时间复杂度为O(1)。数组的插入/删除查找的时间复杂度O(1),但是移动后续数据的时间复杂度为O(n)
因为查找的时间比移动的时间快的多,因此List更适合插入和删除

  • 10.抽象类和接口区别

-抽象类可以实现非抽象方法,接口只能声明方法,无法实现
-抽象类可以声明字段和属性,接口只能声明属性
-抽象类可以使用private、public等访问修饰符,而接口时默认隐式公有
-抽象类无法多重继承,但一个类可以实现多个接口

  • 11.面向对象三大特性和五大原则

面向对象的三大特性是"封装“、“多态”、“继承”
-封装:就是把客观事物封装成抽象的类
-继承:某个类型的对象获得另一个类型的对象的属性的方法
-多态:指一个类实例的相同方法在不同情形有不同表现形式。编译时多态:比如重载。运行时多态:比如重写
五大原则是"单一职责原则"、“开放封闭原则”、“里氏替换原则”、“依赖倒置原则”、“接口分离原则”。
-单一职责原则:一个类的功能要单一,不能包罗万象
-开放封闭原则:对扩展是开放的,而对修改是封闭的。
-里氏替换原则:派生类(子类)对象可以在程序中代替其基类对象,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
-依赖倒置原则:程序要依赖于抽象接口,不要依赖于具体实现。依赖倒置原则-百度百科
-接口分离原则:用多个与特定客户类有关的接口比采用一个通用的接口要好。
如果只有一个接口:客户A想要修改服务器的接口方法,就必须修改service接口和实现接口的servicelmp类,同使还要对客户B,C进行重新编译,即A的修改同使影响了B,C。
在这里插入图片描述
如果每个特定用户类有一个专门的接口,而接口的实现在servicelmp类中,这样修改A接口的方法,只需要修改ServiceA接口和实现接口类servicelmp,B,C不受影在这里插入图片描述

  • 12.Unity Delegate

-委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于对一组方法的列表的引用。

  • 13.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?

支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用

  • 14.Unity 协程 Coroutine是什么

-协程是在主线程中执行,不是异步执行。协程是一个有多个返回点的函数,每一个yield return对应一次返回,能够暂停的,暂停结束后继续执行程序,函数体全部执行完成,协程结束。由于中断指令的出现,使得可以将一个函数分割到多个帧里去执行。在迭代器IEnumrator中写程序,再用StartCoroutine开启协程

  • 15.动态加载方法区别

-Resource.Load,只能加载在Resource文件夹下的已有的,因此会增大安装包
-AssetBundle,加载AB包,这些AB包可以放在服务器端,用WWW或UnityWebRequest加载

  • 16.MVC

-Model-模型,储存数据的对象
-View-视图,模型数据的可视化
-Controller-控制,负责控制模型数据的输入,更新View的显示

  • 17.在C中,Static的作用

-隐藏,当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
-保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初 始化,也是唯一的一次初始化。
-默认初始化为0;

  • 18.在C#中,static作用

-可以修饰类、字段、属性、方法
-标记为static的就不用创建实例对象调用了,
要实例化

  • 19.进程和线程

  • 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是应用程序运行的载体。进程一般由三部分程序,数据集合,进程控制块。程序描述进程需要完成的内容,数据集合就是程序所需的数据和工作区,进程控制块包含了进程的描述信息和控制信息,是进程存在的唯一标志
    -动态性:进程是程序的一次执行,是临时的,有生命周期,动态产生,动态消亡
    -并发性:进程可以同其他一起并发执行
    -独立性:进程是系统进行资源分配和调度的独立单位
    -结构性:由程序、数据、进程控制块组成

  • 线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,一个进程可以包含一个或多个线程,这些线程之间共享这个进程的内存空间。

  • 进程线程主要区别
    -线程是程序执行的最小单位,进程是系统资源分配的最小单位
    -进程可以有一个或多个线程,不同的线程是进程中不同的代码执行路线
    -进程之间相互独立,同一进程的线程是共享程序的内存空间和进程级的资源
    -线程的上下文切换比进程的切换快得多

  • 20.进程切换和线程切换

-进程的切换是虚拟地址空间的转换,而线程是共享所在进程的虚拟空间,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。
虚拟内存是操作系统为每个进程提供的一种抽象,每个进程都有自己 的,私有的,地址连续的虚拟内存,通过页表记录了虚拟内存到物理内存的映射。
页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。

  • 21.二叉树的创建C#

public class TreeNode
{
    public int Data{ get ; set; }
    public TreeNode LeftChild { get; set; }
    public TreeNode RightChild { get; set; }
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值