数据类型转换的三种方式 Convert,parse和TryParse

以Int类型为例,具体说明Convert.ToInt32(object value),int.Parse(object value)和int.TryParse(string s,out int result)的用法

一.int.Parse

int.Parse的底层实现原理(可以直接忽略,不需深究)

[SecuritySafeCritical]
        internal static unsafe int ParseInt32(string s, NumberStyles style, NumberFormatInfo info)
        {
            byte* stackBuffer = stackalloc byte[0x72];
            NumberBuffer number = new NumberBuffer(stackBuffer);
            int num = 0;
            StringToNumber(s, style, ref number, info, false);
            if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None)
            {
                if (!HexNumberToInt32(ref number, ref num))
                {
                    throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
                }
                return num;
            }
            if (!NumberToInt32(ref number, ref num))
            {
                throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
            }
            return num;
        }

int.Parse()是一种类容转换;表示将数字内容的字符串转为int类型。

如果字符串为空,则抛出ArgumentNullException异常;

如果字符串内容不是数字,则抛出FormatException异常;

如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常;

二.Convert.ToInt32

Convert.ToInt32实现方式是这样的(反射源程序集可知):

  public static int ToInt32(string value)
        {
            if (value == null)
            {
                return 0;
            }
            return int.Parse(value, CultureInfo.CurrentCulture);
        }

从上面的代码可以看出Convert.toInt32其实可以看作是对 int.Parse一个改进,因为它判断了值等于null的情况

Convert.ToInt32 参数为 null 时,返回 0

但当Convert.ToInt32参数为string.empty是,就会抛出System.FormatException: 输入字符串的格式不正确异常。

三. int.TryParse

[SecuritySafeCritical]
        internal static unsafe bool TryParseInt32(string s, NumberStyles style, NumberFormatInfo info, out int result)
        {
            byte* stackBuffer = stackalloc byte[0x72];
            NumberBuffer number = new NumberBuffer(stackBuffer);
            result = 0;
            if (!TryStringToNumber(s, style, ref number, info, false))
            {
                return false;
            }
            if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None)
            {
                if (!HexNumberToInt32(ref number, ref result))
                {
                    return false;
                }
            }
            else if (!NumberToInt32(ref number, ref result))
            {
                return false;
            }
            return true;
        }

int.TryParse 可以看作是对int.Parse和Convert.toInt32的改进。

它既判断了值等于null的情况,还判断了string.empty 这样空字符的情况。

所以它不会产生异常,转换成功返回 true,转换失败返回 false。

最后一个参数为输出值,如果转换失败,输出值为 0,如果转换成功,输出值为转换后的int值

四.int.Parse,Convert.ToInt和int.TryParse的比较

1.参数和适用对象不同

int.Parse的参数数据类型只能是string类型,适用对象为string类型的数据

convert.toInt参数比较多,具体可以参见最下面的重载列表

int.TryParse的参数只能是只能是string类型,适用对象为string类型的数据

2.异常情况不同

异常主要是针对数据为null或者为""的情况

Convert.ToInt32 参数为 null 时,返回 0;Convert.ToInt32 参数为 "" 时,抛出异常;

int.Parse 参数为 null 时,抛出异常。; int.Parse 参数为 "" 时,抛出异常。

int.TryParse

3.返回值不同

int.TryParse与int.Parse和Convert.ToInt 在返回值的不同是返回bool类型。获取转换后的值是通过out result这个参数获取的。

五.附

Convert.ToInt 参数重载列表

  名称 描述
  ToInt32(Boolean) 将指定的布尔值转换为等效的 32 位带符号整数。
  ToInt32(Byte) 将指定的 8 位无符号整数的值转换为等效的 32 位有符号整数。
  ToInt32(Char) 将指定的 Unicode 字符的值转换为等效的 32 位有符号整数。
  ToInt32(DateTime) 调用此方法始终引发 InvalidCastException
  ToInt32(Decimal) 将指定的十进制数的值转换为等效的 32 位带符号整数。
  ToInt32(Double) 将指定的双精度浮点数的值转换为等效的 32 位带符号整数。
  ToInt32(Int16) Converts the value of the specified 16-bit signed integer to an equivalent 32-bit signed integer.
  ToInt32(Int32) 返回指定的 32 位有符号整数;不执行实际的转换。
  ToInt32(Int64) Converts the value of the specified 64-bit signed integer to an equivalent 32-bit signed integer.
  ToInt32(Object) 将指定对象的值转换为 32 位带符号整数。
  ToInt32(SByte) 将指定的 8 位带符号整数的值转换为等效的 32 位带符号整数。
  ToInt32(Single) 将指定的单精度浮点数的值转换为等效的 32 位带符号整数。
  ToInt32(String) 将数字的指定字符串表示形式转换为等效的 32 位带符号整数。
  ToInt32(UInt16) 将指定的 16 位无符号整数的值转换为等效的 32 位有符号整数。
  ToInt32(UInt32) 将指定的 32 位无符号整数的值转换为等效的 32 位有符号整数。
  ToInt32(UInt64) Converts the value of the specified 64-bit unsigned integer to an equivalent 32-bit signed integer.
  ToInt32(Object, IFormatProvider) 使用指定的区域性特定格式信息,将指定对象的值转换为 32 位带符号整数。
  ToInt32(String, IFormatProvider) 使用指定的区域性特定格式设置信息,将数字的指定字符串表示形式转换为等效的 32 位带符号整数。
  ToInt32(String, Int32) 将指定基数的数字的字符串表示形式转换为等效的 32 位有符号整数。
时间: 2024-12-17 19:16:26

数据类型转换的三种方式 Convert,parse和TryParse的相关文章

爬虫之数据解析的三种方式

一,正则表达式解析 re正则就不写了,前面已经写入一篇很详细的正则表达式模块了~ 而且,在爬虫中,下面两种方式用的多一些~ 正则表达式:https://www.cnblogs.com/peng104/p/9619801.html 大致用法: pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?src="(.*?)".*?name"><a' +'.*?>(.*?)<

爬虫数据解析的三种方式

一.正则表达式解析 常用正则表达式回顾: 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字.字母.下划线.中文 \W : 非\w \s :所有的空白字符包,括空格.制表符.换页符等等.等价于 [ \f\n\r\t\v]. \S : 非空白 数量修饰: * : 任意多次 >=0 + : 至少1次 >=1 ? : 可有可无 0次或者1次 {m} :固定m次 hello{3,} {m,} :至少m次

SpringMVC数据类型转换的两种方式

1. 自定义类型转换器实现Converter<S,T>接口并加入到SpringMVC的IOC容器中 2.配置自定义转换器到FormattingConversionServiceFactoryBean工厂中! 注意ID好像只能为conversionService 这样通过请求到达目标Handler之前对请求参数进行字符串修改,将Handler入参格式的数据返回,实现转换器的作用 2.相同的原理,用filter拦截请求 自定义filter实现Filter接口:在web.xml里注册filter:用

Android数据存储的三种方式-SharedPrefrences,File,SQLite

1,使用SharedPrefrences 用于简单少量的数据,数据的格式简单:都是普通的字符串,标量类型的值等,比如各种配置信息等等 SharedPrefrences与Editor简介: 创建SharedPreferences实例,通过Context.getSharedPreferences(String name,int mode);方法来获取SharedPreferences的实例 mode的值: *Context.MODE_PRIVATE;该SharedPreferences数据只能被本应

Mysql 删除数据表的三种方式详解

用法:1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除程度可从强到弱如下排列: 1.  drop table tb; drop 是直接将表格删除,无法找回.例如删除 user 表: drop table user; 2.  truncate (table) tb; truncate 是删除表中所有数据,但不能与where一起使用: TRUNCATE TABLE us

数据存储的三种方式

public class SpActivity extends Activity implements OnClickListener { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btnSp).setOnClickListener(this); fin

ios网络学习------4 UIWebView的加载本地数据的三种方式

UIWebView是IOS内置的浏览器,可以浏览网页,打开文档  html/htm  pdf   docx  txt等格式的文件.  safari浏览器就是通过UIWebView做的. 服务器将MIME的标识符等放入传送的数据中告诉浏览器使用那种插件读取相关文件. uiwebview加载各种本地文件(通过loadData方法): - (void)viewDidLoad { [super viewDidLoad]; [self setupUI]; NSString *path = [[NSBund

数据导入HBase最常用的三种方式及实践分析

数据导入HBase最常用的三种方式及实践分析         摘要:要使用Hadoop,需要将现有的各种类型的数据库或数据文件中的数据导入HBase.一般而言,有三种常见方式:使用HBase的API中的Put方法,使用HBase 的bulk load工具和使用定制的MapReduce Job方式.本文均有详细描述. [编者按]要使用Hadoop,数据合并至关重要,HBase应用甚广.一般而言,需要 针对不同情景模式将现有的各种类型的数据库或数据文件中的数据转入至HBase 中.常见方式为:使用H

SpringMVC返回json数据的三种方式

SpringMVC返回json数据的三种方式:http://blog.csdn.net/shan9liang/article/details/42181345 上述第三种方法:可能会出现这个jar包没有的情况,引入即可,下面pom引入即可 java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException