将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。一个参数指定该操作是否区分大小写。 用于指示转换是否成功的返回值。
命名空间:
System
程序集:
mscorlib(在 mscorlib.dll 中)
public static bool TryParse<TEnum>( string value, bool ignoreCase, out TEnum result )where TEnum : struct, new() 类型参数 TEnum 要将 value 转换为的枚举类型。 参数 value 类型:System.String 要转换的枚举名称或基础值的字符串表示形式。 ignoreCase 类型:System.Boolean true 表示不区分大小写;false 表示区分大小写。 result 类型:TEnum% 此方法在返回时包含一个类型为 TEnum 的一个对象,其值由 value 表示。 该参数未经初始化即 被传递。 返回值 类型:System.Boolean 如果 value 参数成功转换,则为 true;否则为 false。
异常:ArgumentException TEnum 不是枚举类型。
备注:
TryParse<TEnum>(String, Boolean, TEnum) 与 Parse(Type, String, Boolean) 方法完全相同,不同之处在于转换失败时,返回 false,而不引发异常。 它消除了在分析的枚举值字符串表示形式时对异常处理的需要。
value 参数中包含枚举成员的基础值或已命名常数、或者用逗号 (,) 分隔的已命名常数或基础值列表的字符串表现形式。 如果 value 包含多个命名常数或值,则 value 中的每个值、名称或逗号的前面或后面都可以有一个或多个空格。 如果 value 是一个列表,则 result 反映了指定名称的值或与位 OR 运算合并的基础值。 如果 value 是枚举值名称的字符串表示形式,则 value 与枚举名称的比较取决于 ignoreCase 参数。 如果为 true,则比较为不分大小写的;如果为 false,则为区分大小写的。
如果 value 是一个不对应 TEnum 的命名常数的名称,则该方法将返回 false。 如果 value 是一个不表示 TEnum 枚举基础值的整数的字符串表示形式,则此方法将返回基础值是已转换为整型的 value 的枚举成员。 如果不希望此行为发生,则请调用 IsDefined 方法以确保整数的特定字符串表示形式实际是 TEnum 的成员。
举例:
下面的示例定义 Colors 枚举,调用 TryParse<TEnum>(String, Boolean, TEnum) 方法将字符串转换为其对应的枚举值,并调用 IsDefined 方法以确保特定整数值是 Colors 枚举中的基础值。 在尝试将命名常数的字符串表现形式转换为其等效的枚举值时,TryParse<TEnum>(String, Boolean, TEnum) 方法将使用不区分大小写的比较。
using System; [Flags]enum Colors { None = 0, Red = 1, Green = 2, Blue = 4 };public class Example { public static void Demo(System.Windows.Controls.TextBlock outputBlock) { string[] colorStrings = { "0", "2", "8", "blue", "Blue", "Yellow", "Red, Green" }; foreach (string colorString in colorStrings) { Colors colorValue; if (Enum.TryParse(colorString, true, out colorValue)) if (Enum.IsDefined(typeof(Colors), colorValue) | colorValue.ToString().Contains(",")) outputBlock.Text += String.Format("Converted '{0}' to {1}.", colorString, colorValue.ToString()) + "\n"; else outputBlock.Text += String.Format("{0} is not an underlying value of the Colors enumeration.", colorString) + "\n"; else outputBlock.Text += String.Format("{0} is not a member of the Colors enumeration.", colorString) + "\n"; } } }
// The example displays the following output: // Converted '0' to None. // Converted '2' to Green. // 8 is not an underlying value(潜在的值) of the Colors enumeration. // Converted 'blue' to Blue. // Converted 'Blue' to Blue. // Yellow is not a member of the Colors enumeration. // Converted 'Red, Green' to Red, Green.
备注:摘自:https://technet.microsoft.com/zh-CN/library/dd991317(v=vs.95)
2.int.tryParse
TryParse():
有时候我们需要把string类型转换成int类型,经常用int.Parse(),但是我觉得不如用int.TryParse(),因为int.Parse()会抛出异常如果有错误,如果避免就需要用判断string参数是不是有效,而int.TryParse()却不需要,他会返回true还是false,当false的时候我们还可以设定默认值。个人觉得用int.TryParse()更好下面代码写用法
看下写法:
//此时会返回false string Str = "122a"; int Number = int.TryParse(Str,outNumber) ? Number : -1; //返回true的结果 string Strr = "12345"; int Numberr = int.TryParse(Strr, out Numberr) ? Numberr : -1; Console.WriteLine("第一个:{0}", Number); Console.WriteLine("第二个:{0}", Numberr);
将日期和时间的指定字符串表示形式转换为其 DateTime 等效项,并返回一个指示转换是否成功的值。
命名空间:
System
程序集:
mscorlib(在 mscorlib.dll 中)
public static bool TryParse( string s, out DateTime result ) 参数 s 类型:System.String 包含要转换的日期和时间的字符串。 result 类型:System.DateTime% 当此方法返回时,如果转换成功,则包含与 s 中包含的日期和时间等效的 DateTime 值; 如果转换失败,则为 DateTime.MinValue。 如果 s 参数为 null、空字符串或者不包含日期和时间的有效字符串表示形式,转换将失败。 该参数未经初始化即被传递。 返回值 类型:System.Boolean 如果 s 参数成功转换,则为 true;否则为 false
TryParse 方法类似于 Parse 方法,不同之处在于 TryParse 方法在转换失败时不引发异常。
字符串 s 是使用 DateTimeFormatInfo 对象中的格式设置信息分析的,该对象由当前区域性提供。
s 参数所包含的日期和时间的表示形式必须使用当前区域性的 DateTimeFormatInfo 对象所识别
的格式之一。
此方法尝试忽略无法识别的数据,如果可能,会用当前日期填充缺少的月、日和年份信息。 如果 s 只包含日期而没有时间,则此方法假设时间为午夜 12:00。 如果 s 包括只有两位数的年份的日期组件,它将转换为基于 Calendar.TwoDigitYearMax 属性值的当前区域性的当前日历一年的值。 s 中的所有前导、内部或尾部空白字符均会被忽略。
由于 DateTime.TryParse(String, DateTime) 方法尝试使用当前区域性的格式设置规则来分析日期和时间的字符串表示形式,因此尝试跨不同区域性分析特定的字符串可能会失败或返回不同的结果。 如果要跨不同的区域设置分析特定的日期和时间格式,请使用 DateTime.TryParse(String, IFormatProvider, DateTimeStyles, DateTime) 方法或 TryParseExact 方法的重载之一,并提供格式说明符。
如果 s 没有包含任何时区信息,则在方法返回时 result 包含一个 Kind 属性为 DateTimeKind.Unspecified 的 DateTime 值。 如果要分析的字符串包含时区信息,则在方法返回时 result 包含一个 Kind 属性为 DateTimeKind.Local 的 DateTime值。
下面的示例将多个日期和时间字符串传递给 DateTime.TryParse(String, DateTime) 方法。
string[] dateStrings = {"05/01/2009 14:57:32.8", "2009-05-01 14:57:32.8", "2009-05-01T14:57:32.8375298-04:00", "5/01/2008 14:57:32.80 -07:00", "1 May 2008 2:57:32.8 PM", "16-05-2009 1:00:32 PM", "Fri, 15 May 2009 20:10:57 GMT" }; DateTime dateValue; outputBlock.Text += String.Format("Attempting to parse strings using {0} culture.", CultureInfo.CurrentCulture.Name) + "\n"; foreach (string dateString in dateStrings){ if (DateTime.TryParse(dateString, out dateValue)) outputBlock.Text += String.Format(" Converted '{0}' to {1} ({2}).", dateString, dateValue, dateValue.Kind) + "\n"; else outputBlock.Text += String.Format(" Unable to parse '{0}'.", dateString) + "\n"; } // The example displays the following output: // Attempting to parse strings using en-US culture. // Converted '05/01/2009 14:57:32.8' to 5/1/2009 2:57:32 PM (Unspecified). // Converted '2009-05-01 14:57:32.8' to 5/1/2009 2:57:32 PM (Unspecified). // Converted '2009-05-01T14:57:32.8375298-04:00' to 5/1/2009 11:57:32 AM (Local). // Converted '5/01/2008 14:57:32.80 -07:00' to 5/1/2008 2:57:32 PM (Local). // Converted '1 May 2008 2:57:32.8 PM' to 5/1/2008 2:57:32 PM (Unspecified) // Unable to parse '16-05-2009 1:00:32 PM'. // Converted 'Fri, 15 May 2009 20:10:57 GMT' to 5/15/2009 1:10:57 PM (Local).
备注:摘自:https://msdn.microsoft.com/zh-cn/library/ch92fbc1(VS.95).aspx
在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法:分别为(int)、int.Parse()、int.TryParse()和Convert.ToInt32(),那么这四种方法对被转换对象有什么限制,以及各自之间有什么区别呢?相信很多童鞋也不能完全说清楚。
下面从被转换对象说起,在我们实际开发项目的过程中,我们碰到需要被转换的类型大概有3大类,分别是空值(NULL)、数字类型(包含float,double,int,long等)和字符串(string)这3类。
先看第一种情况:NULL,采用如下代码进行测试:
int a = Convert.ToInt32(null);
int b;
bool rlt = int.TryParse(null, out b);
int c = int.Parse(null);
int d = (int)null;
很明显,在运行之前VS就会在最后一句报错:“Cannot convert null to 'int' because it is a non-nullable value type”,这是说不能将NULL转换为INT因为INT是一个非空值类型,然后注释掉最后一句,再运行一下,发现这一句(int c = int.Parse(null);)会报如下错误:“Value cannot be null.”,值不能为空,a和b分别返回0,rlt为false;
然后继续看第二种情况:数字类型(主要测试double和long类型),先将代码修改如下:
double m = 1.232d;
int a = Convert.ToInt32(m);
int b;
bool rlt = int.TryParse(m.ToString(), out b);
int c = int.Parse(m.ToString());
int d = (int)m;
然后运行一下,发现这一句(int c = int.Parse(m.ToString());)会报错:“Input string was not in a correct format.”,输入的字符串格式不正确,注释掉这一句然后运行,然后查看返回值,a=1,b=0,rlt=false,d=1,将m的值修改为1.532d后再运行一次,查看结果为a=2,b=0,rlt=false,d=1;下面测试long类型,将代码修改为:
long m = 9223372036854775807;
int a = Convert.ToInt32(m);
int b;
bool rlt = int.TryParse(m.ToString(), out b);
int c = int.Parse(m.ToString());
int d = (int)m;
运行后发现(int a = Convert.ToInt32(m);)和(int c = int.Parse(m.ToString());)报错:“Value was either too large or too small for an Int32.”,值对于Int32太大或太小,其他返回结果b=0,rlt=false,d=-1;
下面继续看第三种情况:字符串,同样修改代码如下:
string m = "1.32";
int a = Convert.ToInt32(m);
int b;
bool rlt = int.TryParse(m, out b);
int c = int.Parse(m);
int d = (int)m;
发现最后一句(int d = (int)m;)报错:“Cannot convert type 'string' to 'int'”,不能转换string到int类型,同样注释掉这句再运行,发现(int a = Convert.ToInt32(m);)和(int c = int.Parse(m);)均报如下的错误:“Input string was not in a correct format.”,输入的字符串格式不正确,只有将m的值修改为整型的字符串(如:”12”)才不会报如此错误。
好了,测试做完了,下面进行总结:
1)对于转换对象,Convert.ToInt32()可以为多种类型(例出数字类型外bool,DateTime等),int.TryParse()和int.Parse()只能是整型字符串类型(即各种整型ToString()之后的形式,不能为浮点型,否则int.Parse()就会出现输入的字符串格式不正确的错误,int.TryParse()也会返回false,输出参数为0),(int)只能是数字类型(例float,int,uint等);
2)对于空值NULL,从运行报错的角度讲,(int)强制转换和int.Parse()都不能接受NULL;Convert.ToInt32()其实是在转换前先做了一个判断,参数如果为NULL,则直接返回0,否则就调用int.Parse()进行转换,int.TryParse()其实是对int.Parse()做了一个异常处理,如果出现异常则返回false,并且将输出参数返回0;
3)针对于浮点型的取舍问题,浮点型只有Convert.ToInt32()和(int)能进行转换,但是也是进行取舍了的,Convert.ToInt32()采取的取舍是进行四舍五入,而(int)则是截取浮点型的整数部分,忽略小数部分,例如Convert.ToInt32(1.499d)和(int)1.499d都返回1,Convert.ToInt32(1.5d)返回2,而(int)1.5d还是返回1;
4)关于溢出,将大的数据类型转换为小的数据类型时Convert.ToInt32()和int.Parse()都会报溢出错误,值对于Int32太大或太小,而(int)不报错,但是返回值为-1。
如此可见,我们在进行数据转换前选择转换方法要谨慎,如果是数字类型可以考虑直接用(int)强制转换,如果是整型字符串类型的,考虑用int.Parse()进行转换,如果不是这两种类型,再考虑用Convert.ToInt32()进行转换。
作者:Statmoon
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。