参见英文答案 >
Fastest way to check if a string can be parsed5个
我必须验证用户输入数据,并确保字符串值可转换为在运行时指定的类型.我不一定需要做实际的转换,只是测试以确保输入值有效.我没有找到一个内置的类或方法来执行这种类型的评估,但如果我缺少一个,请让我知道.我正在使用C#4.0,如果有任何版本特定的解决方案可用.
我必须验证用户输入数据,并确保字符串值可转换为在运行时指定的类型.我不一定需要做实际的转换,只是测试以确保输入值有效.我没有找到一个内置的类或方法来执行这种类型的评估,但如果我缺少一个,请让我知道.我正在使用C#4.0,如果有任何版本特定的解决方案可用.
该方法只需要处理“标准”类型(内置值数据类型加上String).我需要评估的唯一自定义类型是在库中定义的特定枚举类型.
我现在有2个解决方案,但两者都不是完美的,所以我希望有一个第三个选项(或者是我错过的框架内置的东西).我非常倾向于解决方案#2,因为使用解决方案#1中的try-catch似乎错误.
解决方案1:使用try / catch Convert.ChangeType()
public Boolean CheckType(String value,Type type) { try { var obj = Convert.ChangeType(value,type); return true; } catch(InvalidCastException) { return false; } catch(FormatException) { return false; } catch(OverflowException) { return false; } catch(ArgumentNullException) { return false; } }
解决方案2 if / else链类型检查和TryParse
public Boolean CheckType(String value,Type type) { if (type == typeof(String)) { return true; } else if (type == typeof(Boolean)) { Boolean b; return Boolean.TryParse(value,out b); } else if (type == typeof(Int32)) { Int32 i; return Int32.TryParse(value,out i); } else if (type == typeof(Int64)) { Int64 l; return Int64.TryParse(value,out l); } // similar code to check all other types // (Int16,UInt32,UInt64,UInt16,Byte,SByte,Single,Double,Decimal,// Enum,Char,DateTime) . . . . . else throw new ArgumentException("Invalid type evaluation"); }
如果输入数据严重混乱或损坏,这种方法可能会在短时间内被称为几百次甚至一千次,所以我担心重复的if / else检查将会拖累性能(我不是在这一点上一定要尝试优化,我只想确保我正在考虑其他选项).
解决方法
原文地址:https://www.jb51.cc/csharp/96363.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。