关于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 ...
随机推荐
- LN : leetcode 3 Longest Substring Without Repeating Characters
lc 3 Longest Substring Without Repeating Characters 3 Longest Substring Without Repeating Characters ...
- Angular JS中自定义标签 属性绑定的解释
看到自定义标签的文档时,文档作者解释的能力实在太弱,也可能是本人太笨,一下绕不过来. 看了一个stackoverflow答案,才算明白,在此贴出翻译,以供大家参考. .csharpcode, .csh ...
- 微信开发解决if...else..的臃肿
开发中难以避免if...else (switch case ),大量的if...else 让代码可读性低...难以维护 无论是接手别人的代码还是自己写的代码,因为开发周期短可能就往往忽略了这一点. 久 ...
- 初始MongoDB------将MongoDB创建为Windows服务
上一遍我写的是关于基本的MongoDB的安装,可能不是很详细,也写得很不好,不过这次我们会详细的说说,如果将MongoDB部署在你的Windows电脑上. 1.配置环境变量 如果每次都要在CMD进入M ...
- Application received signal SIGSEGV
Application received signal SIGSEGV (null) (( 0 CoreFoundation 0x0000000181037d50 <redacted> + ...
- mac系统,鼠标移动太慢
to check your speed: defaults read -g com.apple.mouse.scaling to set your speed defaults write -g co ...
- CAD绘制自定义实体(com接口)
在cad使用过程中,用户可以绘制自定义实体.点击此处下载演示实例. 调用DrawCustomEntity函数,绘制一个自定义实体对象. 下面代码绘制一个自定义实体,C#代码实现如下: private ...
- A2. JVM 类加载机制
[概述] 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制. 与那些在编译时需要进行连接 ...
- 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版本太低,所以不能使用. 参考: ...
- 【实验级】Docker-Compose搭建单服务器ELK伪集群
本文说明 由于最近在搭ELK的日志系统,为了演示方案搭了个单台服务器的日志系统,就是前一篇文章中所记,其实这些笔记已经整理好久了,一直在解决各种问题就没有发出来.在演示过程中我提到了两个方案,其中之一 ...