Datetime.现在在函数调用中求值

本文关键字:函数调用 Datetime | 更新日期: 2023-09-27 18:14:41

我目前正在编写一段代码,其中我需要根据一年中的当前星期(根据ISO8601标准)命名一个文件夹。

文件夹将被命名为:"y[year]w[week-of-year]"。例如,本周的文件夹名称可以是"y2016w42"。

我现在做的是:

DateTime n = DateTime.Now;
string folderName = "y" + n.Year + "w" + DataHelper.WeekOfYearISO8601(n);

在使用变量n生成文件夹名称之前,我首先将当前时间赋值给变量n。

现在我只想做下面的事情:

string folderName = "y" + DateTime.Now.Year + "w" + DataHelper.WeekOfYearISO8601(DateTime.Now);

DateTime。现在求一次还是两次实际时间?编译器是否从第一次评估中重用它,或者在这种情况下我实际上得到两个不同的时间戳?

我确信这段代码在99.9999%的情况下工作,但是如果这段代码在新年晚上午夜运行会发生什么?(让我们忽略这样一个事实,即根据ISO8601标准,一年中的星期不一定会在新年改变,并假装它们与今年一致)。

如果DateTime。现在被评估两次,我可以想象一个场景,其中一个日期时间仍然在2016年第52周,另一个是在2017年第1周。这可能会带来麻烦,因为文件夹可能会被命名为"2017_52"或"2016_1",这两个名称都是错误的-正确的名称应该是"2017_1"或"2016_52"。

我确信我提供的第一个代码片段是好的,但是第二个代码片段也会在所有情况下工作吗?

Datetime.现在在函数调用中求值

DateTime。现在求一次还是两次实际时间?

由于您调用了两次DateTime.Now,因此它被求值两次。

我确信这段代码在99.9999%的情况下都是有效的,但是如果这样会发生什么呢代码要在除夕午夜运行吗?

。由于此表达式求值两次,它们可能产生不同的结果(假设时钟在两次属性调用之间执行 Tick)。

使用第一个,Luke

据我所知,DateTime.Now每次被调用时都会被评估。可能有一些优化我不知道,但你应该把它作为一个事实,只是为了安全。

为了在0.0001%的时间(可能更少,如果有的话)中保持安全,您应该做的是将DateTime.Now保存在变量中,我真的看不到您首选选项的大优势。

如果可能的话,你可以确保它不会在午夜运行,这也会解决你的问题。

DateTime。Now每次被调用时都会重新求值,分辨率大约为10ms(这里有一个关于它有多精确的讨论:DateTime.Now.Ticks到底是如何工作的?)

你可以很容易地看到这个(实时版本在这里:http://rextester.com/XJVEJ16515):

Console.WriteLine(DateTime.Now.Ticks);
var currVal = DateTime.Now.Ticks;
for (int i = 0; i < 10000; i++) {
    if (currVal != DateTime.Now.Ticks) {
        Console.WriteLine(currVal);
        currVal = DateTime.Now.Ticks;
    }
}

输出:

> 636128255483021039 
> 636128255483177570
> 636128255483333827
> 636128255483489977 
> 636128255483646493 
> 636128255483802799
> 636128255483959218 
> 636128255484115758 
> 636128255484271805
> 636128255484428165

在这种情况下,它实际上并没有每毫秒拆分一个新值

缓存值并像在原始代码中那样使用它;它更安全,但也更容易阅读!

将当前DateTime保存在变量中是最好的选择。如果你调用DateTime。现在,你会得到两次不同的时间