C#(.NET Core 2.0)中的动态类型字段和分配

C#(.NET Core 2.0)中的动态类型字段和分配,c#,dynamic,benchmarking,allocation,expandoobject,C#,Dynamic,Benchmarking,Allocation,Expandoobject,我试图理解为什么将私有字段声明为动态字段,然后将其用作函数的参数会在以后调用该函数时导致多次内存分配;而如果我将字段声明为对象,则似乎根本不会导致分配。对于这两种情况,函数的参数类型仍然是动态的 我使用Visual Studio 2019及其.NET对象分配跟踪分析器在.NET Core 2.2控制台程序上进行了测试 第一次测试: 字段_状态声明为动态类型 public class DynamicStateBenchmark { private dynamic _

我试图理解为什么将私有字段声明为动态字段,然后将其用作函数的参数会在以后调用该函数时导致多次内存分配;而如果我将字段声明为对象,则似乎根本不会导致分配。对于这两种情况,函数的参数类型仍然是动态的

我使用Visual Studio 2019及其.NET对象分配跟踪分析器在.NET Core 2.2控制台程序上进行了测试

第一次测试: 字段_状态声明为动态类型

    public class DynamicStateBenchmark
    {
        private dynamic _state;
        private Func<dynamic, bool> _conditional;

        public void Setup()
        {
            _state = new ExpandoObject();
            _state.A = true;

            _conditional = s => s.A;

            _conditional(_state);
        }

        public void Execute()
        {
            _conditional(_state);
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            var benchmark = new DynamicStateBenchmark();
            benchmark.Setup();
            benchmark.Execute();
        }
    }
公共类DynamicStateBenchmark
{
私有动态;
私有函数有条件;
公共作废设置()
{
_state=新的ExpandoObject();
_state.A=真;
_条件=s=>s.A;
_有条件的(_状态);
}
public void Execute()
{
_有条件的(_状态);
}
}
公共课程
{
公共静态void Main(字符串[]args)
{
var benchmark=新的DynamicStateBenchmark();
benchmark.Setup();
Execute();
}
}
结果: 在Execute()方法中进行了多次分配

第二次测试: 字段_状态声明为对象类型

    public class DynamicStateBenchmark
    {
        private object _state;
        private Func<dynamic, bool> _conditional;

        public void Setup()
        {
            dynamic state = new ExpandoObject();
            state.A = true;
            _state = state;

            _conditional = s => s.A;

            _conditional(_state);
        }

        public void Execute()
        {
            _conditional(_state);
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            var benchmark = new DynamicStateBenchmark();
            benchmark.Setup();
            benchmark.Execute();
        }
    }
公共类DynamicStateBenchmark
{
私有对象状态;
私有函数有条件;
公共作废设置()
{
动态状态=新的ExpandooObject();
state.A=真;
_状态=状态;
_条件=s=>s.A;
_有条件的(_状态);
}
public void Execute()
{
_有条件的(_状态);
}
}
公共课程
{
公共静态void Main(字符串[]args)
{
var benchmark=新的DynamicStateBenchmark();
benchmark.Setup();
Execute();
}
}
结果: Execute()方法内没有分配