【发布时间】:2017-07-20 08:58:23
【问题描述】:
我发现了一些看起来像这样的代码:
var obj = new SomeClass();
obj.FirstProperty = Magic.GetFirstProperty();
//...
obj.CreateDate = DateTime.Now;
obj.ModificationDate = obj.CreateDate;
有很多属性,所以我决定重构代码并使用对象初始化器。
var obj = new SomeClass
{
FirstProperty = Magic.GetFirstProperty();
//...
CreateDate = DateTime.UtcNow,
ModificationDate = DateTime.UtcNow
};
在对象初始化块中将属性从一个重写到另一个是不可能的(据我所知),并且在块外执行它看起来很糟糕(在我看来)。
我决定进行一次测试,经过 10 000 000 次迭代,我得到了 600 到 1200 对不同的配对。这是代码:
class Program
{
static void Main(string[] args)
{
int j = 0;
for (int i = 0; i < 10000000; i++)
{
var obj = new SomeClass
{
First = DateTime.UtcNow,
Second = DateTime.UtcNow
};
if (obj.First != obj.Second)
Console.WriteLine(j++ + " : " + GetDateInfo(obj.First) + " " + GetDateInfo(obj.Second));
}
Console.WriteLine("End of work");
Console.ReadKey();
}
static string GetDateInfo(DateTime dateTime) =>
$"{dateTime.Hour} : {dateTime.Minute} : {dateTime.Second} : {dateTime.Millisecond} - {dateTime.Ticks}";
}
internal class SomeClass
{
public DateTime First { get; set; }
public DateTime Second { get; set; }
}
这里我们有一些结果:
如您所见,某些记录(如 highlithed 记录)仅在处理器滴答数上有所不同。
同时,javascript 总是返回相同的值,除了 Google Chrome 中的内存泄漏。这是代码:
var d,d2,n,n2;
for(var i=0; i<1000000; i++) {
d = new Date();
n = d.getTime();
d2 = new Date();
n2 = d.getTime();
if(n===n2)
console.log("equal");
else
console.log("not equal");
}
您是否知道如何在 .NET 中以适当的方式解决该问题以及 DateTime.Now 的实际工作原理?我很好奇幕后发生了什么。 我期望一次迭代/对象初始化中的两个值是相等的。
【问题讨论】:
-
你有一个循环需要一些时间来执行。为什么你期望
DateTime.Now/UtcNow总是在同一时间返回?如果您运行一周的循环,您仍然希望从上周获得DateTime?至于“日期时间是如何工作的”,请始终阅读documentation。 -
您的代码中有严重的拼写错误。它应该是“n2 = d2.getTime();”
-
@TimSchmelter 请再次阅读 OP 的代码。他不希望两个不同的对象
DateTime值相同,他希望同一个对象的两个不同属性得到相同的 Date 值 -
OP,.getTime() 返回 13 位数字,而 .Ticks 返回 18 位。那是整整 5 位的精度。您突出显示的差异在最后 4 位。想想吧。
-
@er-han 他的 JavaScript 测试似乎与此相矛盾。
标签: javascript c# datetime