C#(.NET Core 2.0)中的动态类型字段和分配
我试图理解为什么将私有字段声明为动态字段,然后将其用作函数的参数会在以后调用该函数时导致多次内存分配;而如果我将字段声明为对象,则似乎根本不会导致分配。对于这两种情况,函数的参数类型仍然是动态的 我使用Visual Studio 2019及其.NET对象分配跟踪分析器在.NET Core 2.2控制台程序上进行了测试 第一次测试: 字段_状态声明为动态类型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 _
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()方法内没有分配