我真的想要回复最短的约会吗?

B. *_*non 21 c# resharper datetime default-value

一位老工作的同事曾经引用他的父亲谈论工具,"你必须比它聪明."

在下面的代码中,Resharper告诉我,"分配的值不会在任何执行路径中使用"(指向第一行).如果我接受其提供的帮助,则不会为dt分配值("今天").

这是一个"我必须比它更聪明"并忽略他们的警告的情况,或者这是一个工具比我聪明的情况,我只是不理解它?

我对这种情况的看法是,如果if语句失败,则返回当前日期(我想要的默认值),但如果我默认Resharper的"需求",它将返回Datetime的默认值,即最小日期,我假设是像7/4/1776或1/1/0000左右.

DateTime dt = DateTime.Now;
if (!(DateTime.TryParse(substr, out dt))) {
    using (var dtpDlgForm = new ReturnDate("Please select the Date that the file was created:")) {
        if (dtpDlgForm.ShowDialog() == DialogResult.OK) {
            dt = dtpDlgForm.ReturnVal;
        } 
    }
}
return dt;
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 53

你接受的答案显示了你应该做的事情,但没有解释为什么 Resharper首先抱怨.由于此解释对于找到您问题的其他人有用,因此这里是:

应该遵循Resharper的建议并将第一行更改为:

DateTime dt;
Run Code Online (Sandbox Code Playgroud)

这声明了变量,dt但没有为它赋值.这里不需要分配值,因为由于out关键字,它将在下一行明确分配.从文档:

虽然作为out参数传递的变量在传递之前不必初始化,但是在方法返回之前需要调用方法来赋值.

强调我的.分配值DateTime.Now是不必要的并且具有误导性,因为永远不会使用此值.

我对这种情况的看法是,如果if语句失败,则返回当前日期

这不是你的代码所做的.从文档:

result:当此方法返回时,如果转换成功,则包含等效于s中包含的日期和时间的DateTime值;如果转换失败,则包含MinValue.

如果解析失败,则使用您发布的代码,然后dt将包含值DateTime.MinValue而不是DateTime.Now您分配的值.


Dou*_*las 23

您的预期逻辑允许三个可能的返回值DateTime(按优先顺序):

  1. 解析后的值substr.
  2. 从对话框中选择的值.
  3. 当前的日期和时间.

您可以通过return在条件成功时执行单独的语句来实现此逻辑:

DateTime dt;
if (DateTime.TryParse(substr, out dt))
    return dt;

using (var dtpDlgForm = new ReturnDate(
    "Please select the Date that the file was created:")) 
{
    if (dtpDlgForm.ShowDialog() == DialogResult.OK)
        return dtpDlgForm.ReturnVal;
}

return DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

编辑:有关为什么不将值赋给将用作out参数的变量的说明,请参阅Mark Byers的答案.

  • 这个答案是对的.几乎*总是*的情况下,ReSharper是正确的.问题是,当@JonSenchnya回答时,DateTime.TryParse()总是在返回之前设置你的`dt`变量.这是'out`参数的要求.因此,你的'dt`的初始值确实永远不会被返回. (5认同)
  • @RossPatterson:答案"错误"怎么样?在任何情况下都会产生不良后果吗?它是否陈述了事实上不正确的内容?它是否指定了"dt`的初始值[确实永远不会被返回"?我承认没有重复大量其他答案中给出的解释,只是为了避免冗余,但提供的解决方案是完整和正确的. (4认同)
  • 谢谢; 所有答案都很棒.我将此标记为"正确",因为即使日期没有被文件名遗漏,然后用户关闭"对话框"表单,提示他/她的日期对话结果不是"确定"它返回"今天"而不是12/7/1941或任何时候. (2认同)
  • @RossPatterson:OP问题中的原始代码在这方面是错误的(因此首先发布问题的动机),但问题已在我的答案代码中得到解决.在解析失败的情况下,将什么值分配给`dt'并没有什么区别,因为它被忽略了. (2认同)
  • 是的,我相信道格拉斯的代码就是OP(我)订购的代码:如果选项A有效,我从文件名中获取日期值.如果没有,并且选项B工作(提示用户输入日期),我会得到该日期.如果两个选项都失败了,我得到了我想要的默认值("今天"),而不是我不想要的DateTime最小值. (2认同)

Jon*_*yna 20

这是因为你要为dt赋值,然后将其作为out参数传递.如果变量作为out参数传入:

  • 必须在该函数内部使用该值,然后才能在其中使用它
  • 必须在该函数返回之前为其分配值

在您的情况下,您可以通过将第一行更改为:来修复来自ReSharper消息的消息:

DateTime dt;
Run Code Online (Sandbox Code Playgroud)

我对这种情况的看法是,如果if语句失败,则返回当前日期

这不是真的.无论您传入的DateTime对象的值如何,它都将始终返回DateTime.MinValue.

MSDN - DateTime.TryParse(string,out DateTime):

结果

类型:System.DateTime%

当此方法返回时,[result]包含等效于s中包含的日期和时间的DateTime值(如果转换成功),或者如果转换失败则包含MinValue.如果s参数为null,为空字符串(""),或者不包含日期和时间的有效字符串表示形式,则转换失败.此参数未初始化传递.

(重点补充)


Oli*_*bes 8

一个out参数始终分配给它的价值.始终保证被调用函数在返回之前为其赋值.因此,它将覆盖在任何情况下最初分配的值.


arc*_*hil 7

这里的要点是关于使用参数修饰符:

尽管作为out参数传递的变量在传递之前不必初始化,但是在方法返回之前需要调用方法来赋值.

DateTime.TryParse将分配一个默认值dt,如果它无法解析substr,结果dt将具有最小日期时间的值.