Unity C# 面试重知识点 和 List 与 Dictionary 和 哈希表


string和StringBuilder

***:stringstring 对象时恒定不变的,改变对象时需要分配新的存储空间 StringBuilder 是字符串变量 ,线程不安全,是直接在内存中改变他的值
String 是字符串常量 。是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象然后将指针指向一个新的对象 ,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。

C#没有StringBuffer,Java里才有


内存管理四大机制 反射,GC,?,?

Garbage Collector(垃圾收集器)

*** 垃圾回收,回收的是堆上的内容(自己手动创建的)
Heap(堆)内存经过回收、压缩,清理之后,可以继续采用前面的heap内存分配方法,当内存达到一定程度,GC会自动进行垃圾的回收。
Sweeping清理,回收死掉的对象。Compaction压缩,去除堆空间的碎片,移动存活对象来获得连续的内存空间

**c#**等则无需手动管理内存,内置了垃圾回收机制,在使用时无需进行内存释放,程序后台自动判断对象是否存活并回收其内存空间

**C++**不具备GC的语言如中,手动创建对象后需要在不使用该对象上手动释放它的内存空间,防止内存泄漏,开发人员必须要时刻小心防止错误释放或忘记释放,在开发效率和程序正确性上都有降低,手动管理内存的难点在于一个内存的是否存活是由整体应用其他部分是否有引用决定的,是一个全局性的信息,而手动管理内存只能根据当前上下文的局部信息来决定。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPool
{
public const string stoneExplosion = “done_explosion_asteroid”;
public const string enemyExplosion = “done_explosion_enemy”;
public const string playerExplosion= “done_explosion_player”;
public const string redStone = “Asteroid_Lrg_B_01”;
public const string boss1 = “Boss1”;
public const string shuijing = “Crystal_Lrg_A_01”;
public const string blackStone = “Done_Asteroid 02”;
public const string playerAttack = “Done_Bolt”;
public const string enemyAttack = “Done_Bolt-Enemy”;
public const string player = “Done_Player”;
public const string purpleEnemy = “Done_PurpleEnemy”;
public const string redEnemy = “Done_RedEnemy”;

/// 
/// 对象池
/// 
private Dictionary> pool;

/// 
/// 预设体
/// 
private Dictionary prefabs;
#region 单例
private static ObjectPool instance;
private ObjectPool()
{
    pool = new Dictionary>();
    prefabs = new Dictionary();
}
public static ObjectPool GetInstance()
{
    if (instance == null)
    {
        instance = new ObjectPool();
    }
    return instance;
}
#endregion


/// 
/// 从对象池中获取对象
/// 
/// 
/// 
public GameObject GetObj(string objName,Vector3 position,Quaternion quaternion)
{
    //结果对象
    GameObject result = null;
    //判断是否有该名字的对象池
    if (pool.ContainsKey(objName))
    {
        //对象池里有对象
        if (pool[objName].Count > 0)
        {
            //获取结果
            result = pool[objName][0];
            //激活对象
            result.transform.position = position;
            result.transform.rotation = quaternion;
            result.SetActive(true);
            //从池中移除该对象
            pool[objName].Remove(result);
            //返回结果
            return result;
        }
    }
    //如果没有该名字的对象池或者该名字对象池没有对象

    GameObject prefab = null;
    //如果已经加载过该预设体
    if (prefabs.ContainsKey(objName))
    {
        prefab = prefabs[objName];
    }
    else     //如果没有加载过该预设体
    {
     

你可能感兴趣的:(Unity C# 面试重知识点 和 List 与 Dictionary 和 哈希表)