我觉得每次我使用TryParse
它都会导致代码有些难看。主要是我这样使用它:
int value;
if (!int.TryParse(someStringValue, out value))
{
value = 0;
}
是否有一些更优雅的解决方案来解析所有基本数据类型,具体来说有没有办法在一行中进行故障安全解析?通过故障保险,我假设如果解析无一例外地失败,则设置默认值。
顺便说一句,这是针对即使解析失败也必须执行某些操作的情况,只需使用默认值即可。
我觉得每次我使用TryParse
它都会导致代码有些难看。主要是我这样使用它:
int value;
if (!int.TryParse(someStringValue, out value))
{
value = 0;
}
是否有一些更优雅的解决方案来解析所有基本数据类型,具体来说有没有办法在一行中进行故障安全解析?通过故障保险,我假设如果解析无一例外地失败,则设置默认值。
顺便说一句,这是针对即使解析失败也必须执行某些操作的情况,只需使用默认值即可。
这是有效的,如果您喜欢单线,您可能会更喜欢它:
int i = int.TryParse(s, out i) ? i : 42;
如果无法解析字符串,则设置 的值i
,否则设置。42
s
i = i
直接扩展方法怎么样?
public static class Extensions
{
public static int? TryParse(this string Source)
{
int result;
if (int.TryParse(Source, out result))
return result;
else
return null;
}
}
或者在一行中使用新的 c# 语法:
public static int? TryParse(this string Source) => int.TryParse(Source, out int result) ? result : (int?)null;
用法:
v = "234".TryParse() ?? 0
您可以编写自己的方法以获得更适合您的解决方案。不久前,我偶然发现了Maybe
包装方法的类。TryParse
int? value = Maybe.ToInt("123");
if (value == null)
{
// not a number
}
else
{
// use value.Value
}
或在线指定默认值:
int value = Maybe.ToInt("123") ?? 0;
Nullable<int>
观察/int?
和之间的区别int
。
有关更多信息,请参阅http://www.kodefuguru.com/post/2010/06/24/TryParse-vs-Convert.aspx
C# 6 C# 7中有一个不错的小功能,声明表达式,所以在 C# 7 中,而不是:
int x;
if (int.TryParse("123", out x))
{
DoSomethingWithX(x);
}
我们可以用:
if (int.TryParse("123", out int x))
{
DoSomethingWithX(x);
}
对我来说足够好:)
在单行中使用 C# 7
int.TryParse(s, out var i) ? i : (int?)null;
示例方法:
public static int? TryParseSafe(string s)
{
return int.TryParse(s, out var i) ? i : (int?)null;
}
在您的特定示例中,您可以这样做:
int value;
int.TryParse(someStringValue, out value);
...因为 Int32.TryParse()value=0
如果解析失败,则记录为设置。
您可以改用 TypeDescriptor:
public T Convert<T>(string input, T defaultVal)
{
var converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T));
if(converter != null)
{
return (T)converter.ConvertFromString(input);
}
return defaultVal;
}
public T Convert<T>(string input)
{
return Convert(input, default(T));
}
您也可以限制T
struct 和 use Nullable
(根据@skarmats 的回答)。
这是尝试 F# 的 C# 开发人员的惊喜之一。TryParse 方法返回一个包含布尔值和值的元组。