本文又可以看作对 TryParse、 Nullable
本文大部分内容参考自《深入理解 C#》 4.4.1 尝试一个不使用输出参数的操作。
TryParse
C# 从 2.0 就引入了 TrySomething + out 参数的模式,比如 Dictionary 的 TryGetValue 和许多用于解析数据的 TryParse。
该模式的核心在于 TrySomething 的返回值用于表示 Something 是否成功,然后具体结果通过 out 参数传出。
随着 C# 的版本更新,TrySomething 模式逐渐普及,C# 程序员们在编写自己的代码时也经常使用该模式。但 TrySomething 的一个弊端也很明显 —— 方法的返回值居然不是最重要的。
TyrParse 示例:
var text = "456";
if (int.TryParse(text, out int num))
{
Console.WriteLine($"num: {num}");
}
else
{
Console.WriteLine("Parse failed!");
}
Nullable
Nullable
Nullable
尤其是在有很多方法参数的情况下,输出参数变得更难发现(更难引起重视),而使用 Nullable
Nullalbe
static void Main(string[] args)
{
var text = "Not a number";
int? parsed = TryParse(text);
if (parsed.HasValue)
{
Console.WriteLine($"Parsed to {parsed.Value}");
}
else
{
Console.WriteLine("Coundn't parse");
}
}
static int? TryParse(string text)
{
int ret;
if (int.TryParse(text, out ret))
{
return ret;
}
return null;
}
Tuple
随 .NET Framework 4.0 推出的 Tuple 有时比 Nullable
- Tuple
用起来比 int? 更整洁一些 - 还可以添加额外信息,例如 Tuple
的最后一个元素可以用于存储解析失败的原因
Tuple 示例:
static void Main(string[] args)
{
var text = "Not a number";
var parsed = TryParse(text);
if (parsed.Item2)
{
Console.WriteLine($"Parsed to {parsed.Item1}");
}
else
{
Console.WriteLine(parsed.Item3);
}
}
static Tuple<int, bool, string> TryParse(string text)
{
if (int.TryParse(text, out int num))
{
return Tuple.Create(num, true, "");
}
return Tuple.Create(0, false, $"Coundn't parse \"{text}\"");
}