值类型的 TryParse 系列方法

张开发
2026/5/12 20:31:37 15 分钟阅读

分享文章

值类型的 TryParse 系列方法
系统整理 C# 中值类型的 TryParse 系列方法和你提供的int.TryParse同类型的核心用法、通用规则和扩展场景帮你掌握这类“安全转换”的统一逻辑。一、TryParse 系列的通用规则所有值类型通用TryParse是 C# 为所有基础值类型提供的安全转换方法核心目的是将字符串转换为对应值类型转换失败时不抛异常仅返回布尔值标识结果。1. 通用语法结构// 基础语法以任意值类型为例[值类型].TryParse(stringinput,// 要转换的字符串out[值类型]result// 输出参数转换成功则为对应值失败则为类型默认值)// 执行逻辑和你的代码完全一致if([值类型].TryParse(input,outvarresult)[对result的额外判断]){// 转换成功且满足额外条件执行后续逻辑}2. 核心特性所有 TryParse 都满足特性说明无异常转换失败如字符串非数字、格式错误时不会抛出FormatException等异常返回值布尔值true转换成功false转换失败out 参数转换成功result 转换后的值转换失败result 类型默认值如 int0boolfalse短路逻辑结合使用时仅当转换成功左边为true才会判断右边的条件二、常用值类型的 TryParse 具体用法覆盖开发高频场景1. 整数类最常用和你的示例同类型// 1. int32位整数你的示例stringpart100;if(int.TryParse(part,outintitemId)itemId0)// 筛选正整数{materialIds.Add(itemId);}// 2. long64位整数处理大数IDstringbigIdStr9999999999;if(long.TryParse(bigIdStr,outlongbigItemId)bigItemId1000){bigIdList.Add(bigItemId);}// 3. short/byte小整数如硬件/协议交互stringshortStr127;if(short.TryParse(shortStr,outshortshortId)shortId0){shortList.Add(shortId);}stringbyteStr255;if(byte.TryParse(byteStr,outbytebyteId)byteId200){byteList.Add(byteId);}2. 浮点数类处理小数// 1. double双精度浮点数通用小数场景stringpriceStr99.99;if(double.TryParse(priceStr,outdoubleprice)price0)// 筛选正数金额{totalPriceprice;}// 2. float单精度浮点数节省内存stringweightStr2.5;if(float.TryParse(weightStr,outfloatweight)weight0.1){weightList.Add(weight);}// 3. decimal高精度小数财务/金额场景必用stringmoneyStr12345.6789;if(decimal.TryParse(moneyStr,outdecimalmoney)money0){accountList.Add(money);}3. 布尔值处理 true/false 字符串stringisActiveStrTrue;// 不区分大小写true/FALSE 都可if(bool.TryParse(isActiveStr,outboolisActive)isActive){// 仅当转换为 true 时执行比如启用功能EnableFunction();}4. 日期时间高频解析场景stringdateStr2026-03-17;// 推荐指定格式文化信息避免系统格式差异导致的转换失败if(DateTime.TryParseExact(dateStr,yyyy-MM-dd,// 明确日期格式System.Globalization.CultureInfo.InvariantCulture,System.Globalization.DateTimeStyles.None,outDateTimedate)dateDateTime.Now)// 筛选未来日期{futureDateList.Add(date);}// 简化版自动适配系统格式慎用if(DateTime.TryParse(dateStr,outDateTimesimpleDate)simpleDateDateTime.Now){pastDateList.Add(simpleDate);}5. 枚举特殊场景字符串转枚举// 先定义枚举publicenumOrderStatus{Pending,Paid,Shipped}stringstatusStrPaid;// 枚举的 TryParse注意第三个参数 ignoreCase 可选是否忽略大小写if(Enum.TryParseOrderStatus(statusStr,true,outOrderStatusstatus)status!OrderStatus.Pending){// 仅当转换成功且状态不是“待处理”时执行ProcessOrder(status);}三、扩展用法批量处理简化重复代码如果你的场景是批量解析多个字符串比如解析列表、数组可以封装成通用方法复用 TryParse 逻辑// 通用方法批量解析字符串为指定类型筛选符合条件的值publicstaticListTParseAndFilterT(IEnumerablestringinputs,FuncT,boolfilter)whereT:struct// 限制为值类型{varresultListnewListT();foreach(varinputininputs){// 利用反射调用对应类型的 TryParse简化版也可手动判断类型vartryParseMethodtypeof(T).GetMethod(TryParse,new[]{typeof(string),typeof(T).MakeByRefType()});if(tryParseMethodnull)continue;object[]parameters{input,default(T)};boolsuccess(bool)tryParseMethod.Invoke(null,parameters);Tvalue(T)parameters[1];if(successfilter(value)){resultList.Add(value);}}returnresultList;}// 调用示例批量解析正整数IDListstringpartListnewListstring{1,0,abc,100,-5};ListintvalidIdsParseAndFilterint(partList,idid0);// 结果validIds [1, 100]三、关键对比TryParse vs Parse避免踩坑很多新手会混淆TryParse和Parse这里明确区别特性TryParse推荐Parse慎用异常处理无异常返回布尔值转换失败抛异常需 try-catch 包裹使用场景不确定输入是否合法如用户输入、文本解析确定输入绝对合法如硬编码字符串代码复杂度简单无需 try-catch复杂需手动加 try-catch示例int.TryParse(abc, out var i)→ falseint.Parse(abc)→ 抛 FormatException总结核心逻辑统一所有[值类型].TryParse都遵循“安全转换返回布尔值out输出结果”的规则结合可实现“转换成功额外筛选”的短路逻辑。高频场景覆盖整数int/long、浮点数double/decimal、布尔值、日期、枚举是开发中最常用的 TryParse 类型用法完全复用你的示例逻辑。最佳实践凡是处理“非绝对可靠的字符串输入”如用户输入、文件解析、接口返回优先用 TryParse 而非 Parse避免程序因格式错误崩溃。

更多文章