我有这样的类的层次结构
public class Class1
{
internal DateTime time = DateTime.Now;
}
public class Class2
{
internal Class1 C1;
public Class2(Class1 c1) { C1 = c1; }
public DateTime Time { get { return C1.time; } }
}
public class Class3
{
internal Class2 C2;
public Class3(Class2 c2) { C2 = c2; }
public DateTime Time { get { return C2.Time; } }
}
public class Class4
{
internal Class3 C3;
public Class4(Class3 c3) { C3 = c3; }
public DateTime Time { get { return C3.Time; } }
}
当我打电话时我想知道
Class4 C4 = new Class4(.....);
Console.WriteLine(C4.Time);
ValueType 数据(在本例中为 DateTime)是否会被复制 4 次,或者 JIT 编译器是否会优化代码并将其重新生成为内联版本,如
C4.C3.C2.C1.time;
C#编译器不做任何优化。 ILDASM 生成的代码在这里:
// get { return C3.Time; }
.method public hidebysig specialname instance valuetype [mscorlib]System.DateTime
get_Time() cil managed
{
// Code size 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldfld class CSTester.Class3 CSTester.Class4::C3
IL_0006: callvirt instance valuetype [mscorlib]System.DateTime CSTester.Class3::get_Time()
IL_000b: ret
} // end of method Class4::get_Time
// get { return C2.Time; }
.method public hidebysig specialname instance valuetype [mscorlib]System.DateTime
get_Time() cil managed
{
// Code size 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldfld class CSTester.Class2 CSTester.Class3::C2
IL_0006: callvirt instance valuetype [mscorlib]System.DateTime CSTester.Class2::get_Time()
IL_000b: ret
} // end of method Class3::get_Time
编辑:代码在启用优化的发布模式下编译。
也许会的。也许不会。也许它会在某些版本的 CLR、某些 CPU 架构上出现,但在其他版本上则不会。
你必须问自己的问题是它到底有多重要。
您有绩效目标和基准吗?
你的代码满足他们的要求吗?
如果不是,你有理由相信这是瓶颈吗?
我发现除了少数应用程序之外,优化与否之间的差异不太可能在任何其他应用程序中都很显着。
Eric Lippert 说我不知道 比我更有说服力。
顺便说一句,
int sizeInBytes;
unsafe
{
sizeInBytes = sizeof(DateTime);
}
对我来说结果值为 8,但依赖它是“不安全”的。 24字节的复制并不值得担心。如果是,也许这部分代码应该使用较低一代的语言。