readonly Func与方法,性能影响/引擎盖下的东西

The*_*kle 2 .net c# methods performance func

将实现引用透明方法作为静态只读Func而不是简单地作为方法,是否有任何性能影响?我个人认为Func版本更具可读性,但传统方式可能更有效.

这个:

static readonly Func<DateTime, DateTime> TruncateDay =
  date => date.AddHours(-date.Hour)
              .AddMinutes(-date.Minute)
              .AddSeconds(-date.Second)
              .AddMilliseconds(-date.Millisecond);

static readonly Func<DateTime, DateTime> TruncateMonth =
  date => TruncateDay(date).AddDays(1 - date.Day);

static readonly Func<DateTime, DateTime> TruncateYear =
  date => TruncateMonth(date).AddMonths(1 - date.Month);

static readonly Func<DateTime, int> QuarterSwitch =
  date => Switch(date.Month % 3, 0,
            Case(1, 3),
            Case(2, 4),
            Case(0, 5));
Run Code Online (Sandbox Code Playgroud)

对此:

static DateTime TruncateDay (DateTime date) 
{ 
  return date.AddHours(-date.Hour)
             .AddMinutes(-date.Minute)
             .AddSeconds(-date.Second)
             .AddMilliseconds(-date.Millisecond);
}

static DateTime TruncateMonth (DateTime date)
{ 
  return TruncateDay(date).AddDays(1 - date.Day);
}

static DateTime TruncateYear (DateTime date)
{
  return TruncateMonth(date).AddMonths(1 - date.Month);
}

static int QuarterSwitch (DateTime date)
{ 
  return Switch(date.Month % 3, 0,
           Case(1, 3),
           Case(2, 4),
           Case(0, 5));
}
Run Code Online (Sandbox Code Playgroud)

这些如何代表内部?编译器将每个翻译成什么?

Jef*_*Sax 5

在引擎盖下,编译器为每个Func方法创建2个额外成员:

  1. 一种静态方法,与传统方法基本相同.
  2. "缓存的委托"字段,与您的委托类型相同.

缓存委托字段的原因是编译器需要这个代码中出现的匿名方法.在这种情况下,编译器不会优化掉字段.

该类还需要一个静态构造函数来为每个方法初始化这两个字段.

一些性能影响是:

  • 必须调用私有静态函数需要很小的开销.随着参数列表的大小增加,此开销增加.
  • Func方法永远不能内联.对于非常小的方法,这可以产生很大的不同.
  • 您班级的元数据将大约增加3倍.这不是免费的,但其影响很难量化.

使用它的一些其他缺点是:

  • 无法进行重载.
  • 在Intellisense中未获取参数名称.
  • 它以多种方式违反了期望,包括方法在语句完成列表中显示为字段的事实.