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(按优先顺序):
substr.您可以通过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的答案.
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,为空字符串(""),或者不包含日期和时间的有效字符串表示形式,则转换失败.此参数未初始化传递.
(重点补充)