关于System.Convert那些事
关于System.Convert那些事
前言
不知咋的,今天腰疼的不行,疼的站不起来了,今下午突然就疼起来了,唉,这是身体要垮了的节奏啊,再加上自己的VAX试用期到了,弄了半天也不行,烦.
正文
看到过一个这种代码:
bool?obj=从server返回来的值,可能为null.
if(obj!=null&&Convert.ToBoolean(obj)==true)
{
//code
}
上面的代码非常清楚,先推断obj是不是null,假设不是null的话,再调用Convert.ToBoolean方法,推断是不是true.
上面的方法没有不论什么问题,可是有一点要确认的是,obj!=null这句话须要推断吗?
于是有了以下的代码
static void Test()
{
Type t = typeof(Convert);
var methods = t.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); foreach (var method in methods)
{
if (!method.Name.StartsWith("To"))
{
continue;
} var paras = method.GetParameters();
if (paras.Length==1&¶s[0].ParameterType==typeof(object))
{
object result;
try
{
result = method.Invoke(null, new object[] { null });
}
catch (Exception)
{
Console.WriteLine("{0}:{1}",method.Name,"转换null失败");
continue;
}
Console.WriteLine("{0}:转换后的值为 {1}",method.Name,result==null? "null" :(result.ToString().Equals(string.Empty))?"空字符串":(result is char)?"空字符":result);
}
}
}
能够看到,method.Invoke(null,new object[]{null})
刻意的为ToXXX方法传递null值.
结果是这种呢?
输出例如以下:
ToBoolean:转换后的值为 False
ToChar:转换后的值为 空字符
ToSByte:转换后的值为 0
ToByte:转换后的值为 0
ToInt16:转换后的值为 0
ToUInt16:转换后的值为 0
ToInt32:转换后的值为 0
ToUInt32:转换后的值为 0
ToInt64:转换后的值为 0
ToUInt64:转换后的值为 0
ToSingle:转换后的值为 0
ToDouble:转换后的值为 0
ToDecimal:转换后的值为 0
ToDateTime:转换后的值为 0001/1/1 0:00:00
ToString:转换后的值为 空字符串
从而证明了,对Convert的ToXXX方法传递null值是不会抛出异常的,而且不返回默认的值.
比如int : 0 ,string : “” ,char :’\0’ , bool : false
有了上面这个几轮有声没用处呢?
这代表了上面的代码能够简化为
if(Convert.ToBoolean(obj))
{
//code
}
顺道提一下
这种代码会抛出异常:
Convert.ToChar(null);
可是这种代码不会抛出异常:
object obj = null;
Convert.ToChar(obj);//返回’\0’空字符
出现上述的原因是啥呢?
Convert.ToChar(null)在内部实际调用的是Convert.ToChar(null,null),然而ToChar(null,,null)的实现例如以下:
if (value == null){ throw new ArgumentNullException("value");}
if (value.Length != 1){ throw new FormatException(Environment.GetResourceString("Format_NeedSingleChar"));}
return value[0];
所以直接传递null值会抛出异常.
关于System.Convert那些事的更多相关文章
- System.Convert.cs
ylbtech-System.Convert.cs 1. 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c56 ...
- (int),Convert.ToInt32(),Int32.Parse(),Int32.TryParsed()的用法总结
1 (int) 强制转型为整型. 当将long,float,double,decimal等类型转换成int类型时可采用这种方式. double dblNum = 20; int intDblNum = ...
- csharp: FTP Client Library using System.Net.FtpWebRequest
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 【c#文档】在 C# 中,(int) ,Int32.Parse() 和 Convert.toInt32() 三种方法的区别
[c#文档]https://msdn.microsoft.com/zh-cn/library/system.convert.toint32.aspx 转载自:http://www.cnblogs.co ...
- 斗天斗地斗控件 -- 与 Flyout 控件的斗争史
前言 在淘宝的收藏夹页面本地化过程中,收藏的宝贝和店铺的分类展示通过一个下拉菜单的方式进行展示.如果单独为此从头重写一个控件,那么不但费时费力,包括所有的动画方式都要全新设计,而且还容易出 bug.好 ...
- 用.net访问电子枢纽信用中心的数据查询服务
概要说明 电子枢纽全称国家交通运输物流公共信息平台,主要提供物流及生产企业进行物流相关数据交换的标准和API,详细介绍可参考其官网www.logink.org,本文假定阅读者对该平台已有了解,并已成功 ...
- c#学习<四>:C#2.0、C#3.0
委托的演变 委托(C#1.0) 委托可看作是只定义了一个方法的接口,将委托的实例看作实现了这个接口的一个对象. 委托的执行要满足4个条件: 1. 声明委托类型 ...
- .NET破解之太乐地图下载器【非暴破】
不知不觉,接触破解逆向已经三个月了,从当初的门外汉到现在的小白,这个过程只有经历过才知道其中的苦与乐: 有无知.困惑.痛苦.惊喜.彻悟.欣慰…… 有无助的软件脱壳,茫然的代码分析,有无趣的反复测试, ...
- 改善C#程序的50种方法
为什么程序已经可以正常工作了,我们还要改变它们呢?答案就是我们可以让它们变得更好.我们常常会改变所使用的工具或者语言,因为新的工具或者语言更富生产力.如果固守旧有的习惯,我们将得不到期望的结果.对于C ...
随机推荐
- 关于java中replace的用法
今天突然看到Java中的replace有两种方法,一种是直接替换,另一种是可以进行匹配替换的方式: public String replace(CharSequence target, CharSeq ...
- HTML空格占位
它叫不换行空格,全称No-Break Space,它是最常见和我们使用最多的空格,大多数的人可能只接触了 ,它是按下space键产生的空格.在HTML中,如果你用空格键产生此空格,空格是不会累加的 ...
- Android Camera 3D效果
一.概念 在Android中要想实现3D效果,第一个想到的应该就是OpenGL ES,因为在很多基础教材中几乎都提到了它.但是其使用起来还是稍微麻烦一些,而且它也主要用在游戏方面,那在应用方面有没有更 ...
- 启用adb wifi无线调试功能(无需root)
1 工具 电脑.手机 2 前提 电脑和手机出于同一网段 3 步骤 以管理员方式打开cmd,运行 adb tcpip 5555(执行tcpip调试模式) adb connect 192.168. ...
- iOS中ARC和非ARC混用
如果在使用第三方类库的时候,我们可能会遇到一些内存管理的问题 那么如何在一个工程中实现ARC和非ARC混用呢,例如你创建一个ARC的工程,但是你引用的第三方类库是非ARC管理内存的 首先点击工 ...
- jsp学习笔记 - 内置对象 session
1.session 主要用来用户的登录和注销 设置用户名,获取用户名 session.setAttribute("username","johnson"); s ...
- 关于联想笔记本不能连接无线网(wifi),注销后重新登录才可以连接
解决联想笔记本wifi问题(果果) 最近很多使用联想的朋友都遇到了这样一个问题,那就是笔记本的wifi突然不能用了,好吧,其实我个人也遇到了这个问题,但是网上貌似对这个问题并没有给出一个可以解决的办法 ...
- 【转载】自制4412底板自动进入SD卡更新模块
转载自迅为论坛:http://www.topeetboard.com参考平台:迅为iTOP-4412开发板 问题如下:在自制的底板上,当SD卡插在板子上开机时,会自动进入Updating模式,如果SD ...
- Loadrunner12 安装与卸载
卸载:http://www.51testing.com/html/21/303921-216608.html 安装包下载: loadrunner12安装包下载:链接:https://pan.baidu ...
- react 中样式私有
解决的问题,两个组件之间 有相同的class名,造成其中一个无法按预期的显示. import React, { Component } from 'react' import styles from ...