函数调用

时间:2016-10-23 11:05:48

标签: c# datetime

我正在处理一段代码,我需要根据当前的一周命名文件夹(根据ISO8601标准)。

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

我目前正在执行以下操作:

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

我首先将当前时间分配给变量n,然后再使用它来生成文件夹名称。

现在我实际上只是做以下事情:

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

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

我确定这段代码在99.9999%的情况下有效,但如果此代码在午夜的新年晚上运行会怎样? (根据ISO8601标准,我们可以忽略这样一个事实,那就是纽约证券交易所一年中没有发生任何变化,并假装它们在今年重合。)

如果DateTime.Now被评估两次,我可以想象一个场景,其中一个DateTimes仍然在2016年第52周,而另一个是在2017年第1周。这可能会带来麻烦,因为文件夹可能会被命名为& #34; 2017_52"或" 2016_1",这两个都是错误的 - 正确的将是" 2017_1"或" 2016_52"。

我确定我提供的第一段代码是可以的,但第二个代码段是否也适用于所有情况?

4 个答案:

答案 0 :(得分:3)

  

DateTime.Now是否按实际时间评估一次或两次?

由于您两次调用DateTime.Now,因此会对其进行两次评估。

  

我确定此代码在99.9999%的时间内有效,但如果发生这种情况会发生什么   代码是在午夜的新年晚上运行的?

完全。由于此表达式计算了两次,因此可能生成不同的结果(假设两个属性调用之间的时钟 Tick。)

使用第一个,卢克。

答案 1 :(得分:2)

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

你应该做些什么才能在0.0001%的时间内保持安全(可能更少,如果有的话)是将DateTime.Now保留在一个变量中,我真的看不出你喜欢的大优势选项。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

DateTime.Now每次调用时都会重新评估,分辨率约为10毫秒(这里有一个很好的讨论:How does DateTime.Now.Ticks exactly work?

您可以非常轻松地看到这一点(此处的实时版本: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

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

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