本文又可以看作对 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}\"");}
