是否值得缓存成员结构?

时间:2015-05-29 01:30:04

标签: c# caching struct value-type

我有一个类似这样的属性:

DateTime MinDate
{
    get { return new DateTime(2005, 3, 25); }
}

我担心的是,每次调用Derived.MinDate时,调用DateTime都会构造一个新的_MinDate,所以我希望有一个只构造一次的基础private readonly DateTime _MinDate = new DateTime(2005, 3, 25); DateTime MinDate { get { return _MinDate; } }

DateTime

但这有什么影响,因为MinDate是一个结构吗? 场景1: DateTime构建一个新的_MinDate,然后将其复制到调用方。 场景2: MinDate被复制到{{1}},并被复制到调用方。两种情况同样效率低下,对吧?

4 个答案:

答案 0 :(得分:4)

差不多正确;没有理由这样做。

通过缓存结构,您需要复制缓存值的字节。

通过构造它,你需要调用构造函数,它将设置struct的字段。

如果构造函数执行昂贵的工作,缓存可能很有用。

documentation做了相当多的工作,所以如果你多次打电话给那个房产,那可能是值得的。
但是,只有在实际看到性能问题时才应该这样做。

答案 1 :(得分:4)

在内部,DateTime(Int32, Int32, Int32)构造函数非常便宜:它执行一个简单的乘法运算,将年,月和日转换为内部64位“Tick”值。

AFAIK CLR不会缓存确定性结构构造函数实例(但这将是一个很好的优化!)。

但是,如果你每秒调用构造函数数百次,我只会缓存这个值,但如果你真的想这样做,那么这就行了:

private static readonly DateTime _minDate = new DateTime( 2005, 3, 25 );
protected override DateTime MinDate { get { return _minDate; } }

答案 2 :(得分:1)

传递给另一个变量时复制的概念是正确的,因为DateTime是一个结构。

以下是实现目标的一种方法: -

abstract class Base
{
    protected abstract void GetMinDate (ref DateTime minDate);
}

class Derived
{
    private static readonly DateTime _MinDate;
    static Derived()
    {
       _MinDate = new DateTime(2005, 3, 25);
    }
    protected override void GetMinDate (ref DateTime minDate);
    {
        minDate = _MinDate;
    }
}

GetMinDate将始终按ref返回最小日期,并且将是要复制或不复制的来电者问题。

答案 3 :(得分:1)

从C#6.0开始,现在有一种更简单的方法可以使用自动实现的属性初始值设定项:

DateTime MinDate { get; } = new DateTime(y, m, d);

编辑:这实际上是该功能的预期用途,编译器会自动生成支持字段readonly;实际上,您可以在构造函数中对它们执行set操作。他们称之为“仅限getter”的自动属性。"有关详细信息,请参阅here