在Stack Overflow上阅读后,我得知在检查DateTime格式的情况下应该使用DateTime.TryParse。尝试了一些正则表达式后,它们似乎变得很长而且难以覆盖许多格式。
但是TryParse方法需要一个“out”参数,由于我只想进行格式验证检查,所以不需要实际的结果。
因此,我现在只有一个保存了“out”结果的变量,却无法对其进行任何操作。是否有一种方法可以避免使用out参数呢?
这样可以消除警告并停止让这个变量在代码中闲置。
在Stack Overflow上阅读后,我得知在检查DateTime格式的情况下应该使用DateTime.TryParse。尝试了一些正则表达式后,它们似乎变得很长而且难以覆盖许多格式。
但是TryParse方法需要一个“out”参数,由于我只想进行格式验证检查,所以不需要实际的结果。
因此,我现在只有一个保存了“out”结果的变量,却无法对其进行任何操作。是否有一种方法可以避免使用out参数呢?
这样可以消除警告并停止让这个变量在代码中闲置。
从C#7.0开始(自2016年8月),您可以使用out var结构,然后在随后的代码中忽略新的var。
bool success = DateTime.TryParse(value, out var result);
如果您真的不关心结果的值,请使用discards:
bool success = DateTime.TryParse(value, out _);
不是的。我会将它包装在一个方法中,以便使主要代码更加清晰:
bool IsValidDate(string value)
{
DateTime result;
return DateTime.TryParse(value, out result); //result is stored, but you only care about the return value of TryParse()
}
我并不建议你真的这样做,但你可以使用一个单独的帮助类来使得所有的输出参数变得更加容易:
public static class OutHelper<T>
{
[ThreadStatic]
public static T Ignored;
}
然后你可以调用:
if (DateTime.TryParse(text, out OutHelper<DateTime>.Ignored))
这真是太糟糕了,它使用一个公共的可变字段,如果你的应用程序也在执行某些恶意代码,则该代码可以访问你解析的最后一个值...但它应该能正常工作 :)
out
参数用作临时存储并在完成后也包含返回值的情况。虽然对于被调用者假设它不会改变是个坏主意,但这是一种自然的期望。使用全局变量来达到这个目的严重破坏了这种假设。无论如何,正如你所提到的,这基本上是一种“技巧”,在实践中应该避免使用。 - Mehrdad Afsharipublic static bool IsValidDate(this string value)
{
DateTime date = DateTime.Null;
return DateTime.TryParse(value, out date);
}
[已编辑,将方法名更改为更合适的名称]
不,你不能摆脱这个变量,但你也不应该收到编译器的警告。
将一个变量作为 out
参数传递是“使用”该变量。编译器不会因此发出警告。
TryParse
是更好的选择。这只是一个浪费的变量。其他选项包括在 try-catch 块中使用 Convert.ToDateTime()
。但是,这也不是很有效率,因为 try-catch 块通常比较重。下一个选项是正则表达式。这是更好的解决方案。我想这比其他方法更快地给出结果。
你可以像 Kim Gräsman 所说的那样很好地封装这个方法...