关于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那些事的更多相关文章

  1. System.Convert.cs

    ylbtech-System.Convert.cs 1. 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c56 ...

  2. (int),Convert.ToInt32(),Int32.Parse(),Int32.TryParsed()的用法总结

    1 (int) 强制转型为整型. 当将long,float,double,decimal等类型转换成int类型时可采用这种方式. double dblNum = 20; int intDblNum = ...

  3. csharp: FTP Client Library using System.Net.FtpWebRequest

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  4. 【c#文档】在 C# 中,(int) ,Int32.Parse() 和 Convert.toInt32() 三种方法的区别

    [c#文档]https://msdn.microsoft.com/zh-cn/library/system.convert.toint32.aspx 转载自:http://www.cnblogs.co ...

  5. 斗天斗地斗控件 -- 与 Flyout 控件的斗争史

    前言 在淘宝的收藏夹页面本地化过程中,收藏的宝贝和店铺的分类展示通过一个下拉菜单的方式进行展示.如果单独为此从头重写一个控件,那么不但费时费力,包括所有的动画方式都要全新设计,而且还容易出 bug.好 ...

  6. 用.net访问电子枢纽信用中心的数据查询服务

    概要说明 电子枢纽全称国家交通运输物流公共信息平台,主要提供物流及生产企业进行物流相关数据交换的标准和API,详细介绍可参考其官网www.logink.org,本文假定阅读者对该平台已有了解,并已成功 ...

  7. c#学习<四>:C#2.0、C#3.0

    委托的演变 委托(C#1.0) 委托可看作是只定义了一个方法的接口,将委托的实例看作实现了这个接口的一个对象. 委托的执行要满足4个条件: 1. 声明委托类型                     ...

  8. .NET破解之太乐地图下载器【非暴破】

    不知不觉,接触破解逆向已经三个月了,从当初的门外汉到现在的小白,这个过程只有经历过才知道其中的苦与乐: 有无知.困惑.痛苦.惊喜.彻悟.欣慰…… 有无助的软件脱壳,茫然的代码分析,有无趣的反复测试, ...

  9. 改善C#程序的50种方法

    为什么程序已经可以正常工作了,我们还要改变它们呢?答案就是我们可以让它们变得更好.我们常常会改变所使用的工具或者语言,因为新的工具或者语言更富生产力.如果固守旧有的习惯,我们将得不到期望的结果.对于C ...

随机推荐

  1. 关于java中replace的用法

    今天突然看到Java中的replace有两种方法,一种是直接替换,另一种是可以进行匹配替换的方式: public String replace(CharSequence target, CharSeq ...

  2. HTML空格占位

      它叫不换行空格,全称No-Break Space,它是最常见和我们使用最多的空格,大多数的人可能只接触了 ,它是按下space键产生的空格.在HTML中,如果你用空格键产生此空格,空格是不会累加的 ...

  3. Android Camera 3D效果

    一.概念 在Android中要想实现3D效果,第一个想到的应该就是OpenGL ES,因为在很多基础教材中几乎都提到了它.但是其使用起来还是稍微麻烦一些,而且它也主要用在游戏方面,那在应用方面有没有更 ...

  4. 启用adb wifi无线调试功能(无需root)

    1  工具 电脑.手机 2  前提 电脑和手机出于同一网段 3  步骤 以管理员方式打开cmd,运行 adb tcpip 5555(执行tcpip调试模式) adb connect  192.168. ...

  5. iOS中ARC和非ARC混用

    如果在使用第三方类库的时候,我们可能会遇到一些内存管理的问题   那么如何在一个工程中实现ARC和非ARC混用呢,例如你创建一个ARC的工程,但是你引用的第三方类库是非ARC管理内存的   首先点击工 ...

  6. jsp学习笔记 - 内置对象 session

    1.session 主要用来用户的登录和注销 设置用户名,获取用户名 session.setAttribute("username","johnson"); s ...

  7. 关于联想笔记本不能连接无线网(wifi),注销后重新登录才可以连接

    解决联想笔记本wifi问题(果果) 最近很多使用联想的朋友都遇到了这样一个问题,那就是笔记本的wifi突然不能用了,好吧,其实我个人也遇到了这个问题,但是网上貌似对这个问题并没有给出一个可以解决的办法 ...

  8. 【转载】自制4412底板自动进入SD卡更新模块

    转载自迅为论坛:http://www.topeetboard.com参考平台:迅为iTOP-4412开发板 问题如下:在自制的底板上,当SD卡插在板子上开机时,会自动进入Updating模式,如果SD ...

  9. Loadrunner12 安装与卸载

    卸载:http://www.51testing.com/html/21/303921-216608.html 安装包下载: loadrunner12安装包下载:链接:https://pan.baidu ...

  10. react 中样式私有

    解决的问题,两个组件之间  有相同的class名,造成其中一个无法按预期的显示. import React, { Component } from 'react' import styles from ...