我有一个类似这样的属性:
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}},并被复制到调用方。两种情况同样效率低下,对吧?
答案 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。