首页 / Unity3d / C#

读一读

public static int Match(int num)
{
    return num switch
    { 
        > 5 => 0,
        < 5 => 2,
        5 => 3
    };
}


编辑器会根据情况生成最优的if else或则是switch


可以对dll或则是assetbundle进行压缩,减少大小

public class CompressUtil
{
    public static byte[] Compress(byte[] data)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress))
            {
                gzipStream.Write(data, 0, data.Length);
            }

            return memoryStream.ToArray();
        }
    }

    public static byte[] UnCompress(byte[] data)
    {
        using (var memoryStream = new MemoryStream(data))
        {
            using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
            {
                using (var output = new MemoryStream())
                {
                    gzipStream.CopyTo(output);
                    return output.ToArray();
                }
            }
        }
    }
}



  1. 常用的字符串生成后缓存起来,不然一直操作字符串需要频繁分配内存,临时变量还会生成很多垃圾。

  2. 使用“不安全”的native,就是类似的c++的指针方式来处理string。


  1. struct是值类型,传递的时候是通过字节对齐规则循环多次复制内存的。

  2. struct是值类型,分配的内存是在栈上的,数据存储是连续,并且栈的回收非常快速和简单,只需要将尾指针置0就可以了,这样不会产生内存碎片,又不需要内存垃圾回收。


装箱和拆箱会造成内存分配和复制内容,会造成很多垃圾。

  1. 自定义类来封装值类型,通过对象池管理。

  2. 通过泛型参数传递替代object参数通用传递。


浮点数的计算为 F=(-1^s)×(1.M)×(2^e),所以会出现精度问题

  1. 数值比较不相等,要使用近似比较

  2. 数值计算不确定

  3. 不同设备的计算结果不同


解决办法

  1. 使用整数代替浮点数,例如精度为3的使用×1000的整数

  2. 实现定点数,例如使用两个int,一个为整数部分,一个为小数部分

  3. 使用字符串表示,可以无限的精度,计算消耗大



  1. 内部实现为数组的方式,使用hash的方式映射键值到指定数组。数组保存的是链表的头指针。

  2. 内部数组不够也是有扩容操作,扩容为质数。

  3. 查找hash冲突时会遍历指定链表,对比key值。

  4. 添加键值对是插入为头指针的。


  1. 不指定容量的情况下,默认为4,Add和Insert不够的时候会成倍扩容,不断增加会产生垃圾。

  2. RemoveAt、InsertAt等接口会对数组进行O(n)的移动操作。

  3. Contains、Find为遍历数组O(n)操作。

  4. ToArray会复制一份数组,会引起内存分配。

  5. 使用foreach会生成Enumerator对象,产生垃圾。

  6. Sort用的是Array的Sort,内部为快速排序。

  7. 线程不安全的,好用但效率不高。


bool HasChinessString(string str)
{
    char[] c = str.ToCharArray();
    for (int i = 0; i < str.Length; i++)
    {
        if ((int)c[i] > 127)
            return true;
    }

    return false;
}

Debug.LogError(sizeof(float) == sizeof(uint)); //true
Debug.Log(float.MaxValue > uint.MaxValue); //true
Debug.Log("float Max:" + float.MaxValue); //3.402823E+38
Debug.Log("uint Max:" + uint.MaxValue); //4294967295


上面代码中,可以看出float和uint的字节数是相同的,但是float能表示的最大值是比uint打的。通过了解,得知float的表示方式是 1 + 8 + 23的形式,1位表示符号,8位表示指数部分,23位表示有效数值部分,其实是24位,所以能表示精确的最大范围就是2^24=16777216。所以当需要大精度计算数值时,可以使用decimal顶点数,它的存储空间是16*8位。