关于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. LN : leetcode 3 Longest Substring Without Repeating Characters

    lc 3 Longest Substring Without Repeating Characters 3 Longest Substring Without Repeating Characters ...

  2. Angular JS中自定义标签 属性绑定的解释

    看到自定义标签的文档时,文档作者解释的能力实在太弱,也可能是本人太笨,一下绕不过来. 看了一个stackoverflow答案,才算明白,在此贴出翻译,以供大家参考. .csharpcode, .csh ...

  3. 微信开发解决if...else..的臃肿

    开发中难以避免if...else (switch case ),大量的if...else 让代码可读性低...难以维护 无论是接手别人的代码还是自己写的代码,因为开发周期短可能就往往忽略了这一点. 久 ...

  4. 初始MongoDB------将MongoDB创建为Windows服务

    上一遍我写的是关于基本的MongoDB的安装,可能不是很详细,也写得很不好,不过这次我们会详细的说说,如果将MongoDB部署在你的Windows电脑上. 1.配置环境变量 如果每次都要在CMD进入M ...

  5. Application received signal SIGSEGV

    Application received signal SIGSEGV (null) (( 0 CoreFoundation 0x0000000181037d50 <redacted> + ...

  6. mac系统,鼠标移动太慢

    to check your speed: defaults read -g com.apple.mouse.scaling to set your speed defaults write -g co ...

  7. CAD绘制自定义实体(com接口)

    在cad使用过程中,用户可以绘制自定义实体.点击此处下载演示实例. 调用DrawCustomEntity函数,绘制一个自定义实体对象. 下面代码绘制一个自定义实体,C#代码实现如下: private ...

  8. A2. JVM 类加载机制

    [概述] 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制. 与那些在编译时需要进行连接 ...

  9. Getting start with dbus in systemd (03) - sd-bus.h 使用例子 (systemd version>=221)

    sd-bus.h 例子 注意: sd-dbus 是systemd提供的lib,但是这个lib,只有在systemd>v221版本后才可以使用,centos 219版本太低,所以不能使用. 参考: ...

  10. 【实验级】Docker-Compose搭建单服务器ELK伪集群

    本文说明 由于最近在搭ELK的日志系统,为了演示方案搭了个单台服务器的日志系统,就是前一篇文章中所记,其实这些笔记已经整理好久了,一直在解决各种问题就没有发出来.在演示过程中我提到了两个方案,其中之一 ...