C#测试params和dynamic

先测试params 他可以让我们同时传递多个参数,但是又不知道参数数量

List a = new List() { 3, 1, 2,4,5 };

        Stopwatch sw = new Stopwatch();
        sw.Start();
        Dic(3, 1, 2, 4, 5);
        foreach (var item in a)
        {
            UnityEngine.Debug.Log(item);
        }
        sw.Stop();
       UnityEngine.Debug.Log(sw.ElapsedMilliseconds);
public void Dic(params int[] obj)
    {
        foreach (var item in obj)
        {
            UnityEngine.Debug.Log(item);
        }
    }

这个是foreach的时间


image.png

params 时间好像都一样


image.png

因为params需要一个一个点 所以没办法for循环测试

然后测试dynamic 这个是类似于反射,动态对象,相当于动态的var,可以当参数,不过点不出来属性,这个要全靠想,猜,我一般是别的地方点出来粘贴过去
这个是dynamic 时间


image.png

这个var


image.png

看来内部做了一些工作
  Stopwatch sw = new Stopwatch();
        sw.Start();
        //Dic(3, 1, 2, 4, 5);
        //foreach (var item in a)
        //{
        //    UnityEngine.Debug.Log(item);
        //}

        var b = a;     

        foreach (var item in b)
        {
            UnityEngine.Debug.Log(item);
        }
        sw.Stop();
        UnityEngine.Debug.Log(sw.ElapsedMilliseconds);

这个效率堪忧,平时确定类型的话还是不要用了吧,看别人说是在Linq返回匿名类型时接收用,用object装箱 但是不知道怎么拆箱可以用dynamic去拆,params其实用处也不大都被list代替了
这个是本人两者结合的骚操作

  public void Dic(params dynamic[] obj)
    {
        foreach (var item in obj)
        {
            if (item.GetType().ToString().Contains("List"))
            {
                foreach (var i in item)
                {
                    UnityEngine.Debug.Log(i);
                }
            }
        }
    }

感觉就是个ArrayList

 Dic("as",1 , 2, 4, a);
        ArrayList z = new ArrayList() {"a",1,a };

这个是ArrayList


image.png

这个是个人自定义类型


image.png

本来不用ArrayList就因为是消耗性能,这个反倒是更消耗
 Stopwatch sw = new Stopwatch();
        sw.Start();
        Dic("as",1 , 2, 4, a);
        //ArrayList z = new ArrayList() {"a",1,a };
        //foreach (var item in z)
        //{
        //    if (item.GetType().ToString().Contains("List"))
        //    {
        //        foreach (var j in (List)item)
        //        {
        //            UnityEngine.Debug.Log(j);

        //        }            
        //    }
        //}
sw.Stop();
 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);

可能是ArrayList强转必须知道类型,而这个不需要的原因吧
然后测试下基本用法params 传入obj


image.png

这个就和ArrayList差不多 要装箱拆箱

   public void Dic(params object[] obj)
    {
        foreach (var item in obj)
        {
            UnityEngine.Debug.Log(item);
        }
    }

还有记得用params 如果是无参记得传入null 不然会创建数组产生gc
如果是用泛型想传别的参数
不过必须要写在他之前,类似于那个传默认值一样要写在最后

public void Dic(int num,params T[] obj)

你可能感兴趣的:(C#测试params和dynamic)