1. 概述

  本章介绍 值类型的装箱拆箱、类型转换 以及 C#4.0新推出的 dynamic 关键字。

2. 主要内容

  2.1 装箱和拆箱

  2.2 类型转换

    有四种方式可以实现类型转换:

    ① 隐式转换:编译器允许的,类型安全的转换。无需特殊的标记符号,编译器直接转换。

    ② 显式转换:无法隐式转换,可能会丢失精度的情况,需要用类型符号来强制转换。

    ③ 自定义转换

class Money
{
public Money(decimal amount)
{
Amount = amount;
} public decimal Amount { get; set; } public static implicit operator decimal(Money money)
{
return money.Amount;
} public static explicit operator int(Money money)
{
return (int)money.Amount;
}
} Money money = new Money(42.23M);
decimal amount = money;
int truncatedAmount = (int)money;

    ④ 使用辅助类转换(System.BitConvertor, System.Convert, Parse, TryParse)

int value = Convert.ToInt32("");
value = int.Parse("");
bool success = int.TryParse("", out value);

    * isas 关键字,可以验证转换是否可行。如果仅判断不做实际转换,用is,否则用as。两者都可用于Nullable。

void OpenConnection(DbConnection con)
{
if (con is SqlConnection)
...
} void LogStream(Stream stream)
{
MemoryStream memoryStream = stream as MemoryStream;
if (memoryStream != null)
...
}

  2.3 使用动态类型(dynamic types)

    使用dynamic的地方,编译器不会做类型检测。使用的地方一般包括:

    ① 与外部资源交互时。比如 COM Interop、Iron-Pathon、JSON、DOM。

    ② 在C#中使用反射时。

static void DisplayInExcel(IEnumerable<dynamic> entities)
{
var excelApp = new Excel.Application();
excelApp.Visible = true; excelApp.Workbooks.Add(); dynamic worksheet = excelApp.ActiveSheet; worksheet.Cells[, "A"] = "Header A";
worksheet.Cells[, "B"] = "Header B"; var row = ;
foreach(var entity in entities)
{
row++;
worksheet.Cells[row, "A"] = entity.ColumnA;
worksheet.Cells[row, "B"] = entity.ColumnB;
} worksheet.Columns[].AutoFit();
worksheet.Columns[].AutoFit();
} var entities = new List<dynamic>
{
new { ColumnA = , ColumnB = "Foo"},
new { ColumnA = , ColumnB = "Bar"}
}; DisplayInExcel(entities);

    DynamicObjectExpandoObject

public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder,
out object result)
{
result = binder.Name;
return true;
}
} dynamic obj = new SampleObject();
Console.WriteLine(obj.SomeProperty); //displays 'SomeProperty'
//ExpandoObject
public ActionResult Index()
{
ViewBag.MyDynamicValue = "This property is not statically typed";
return View();
}

3. 总结

  ① 当一个值类型被当做引用类型使用时,就会发生装箱。

  ② 需要类型转换时,可以使用隐式和显式转换。并且可以定义自己的隐式和显式转换。

  ③ dynamic 关键字可以绕过C#的类型检测,可以与其他语言更好的交互。

第七章 管理类型(In .net4.5) 之 使用类型的更多相关文章

  1. 第六章 管理类型(In .net4.5) 之 创建类型

    1. 概述 本章内容包括 C#5中如何更好的创建类型以及如何扩展现有类型. 2. 主要内容 2.1 如何选择类型 C#类型系统包括三种类型:值类型.引用类型.指针类型.(指针类型用于非托管代码,很少使 ...

  2. 网络操作系统 第七章 管理TCP/IP网络

    本章小结 本章介绍了TCP/IP的相关概念,并且在此处基础上,介绍了Windows Server 2008中使用TCP/IP网络配置工具实现网络连接和管理的方法,在Linux系统中,讲解了是如何使用图 ...

  3. kubernetes第七章--管理存储资源

  4. 【转】第七章、Linux 文件与目录管理

    原文网址:http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php 第七章.Linux 文件与目录管理 最近升级日期:2009/08/26 ...

  5. 第七章、Linux 文件与目录管理

    第七章.Linux 文件与目录管理   1. 目录与路径 1.1 相对路径与绝对路径 1.2 目录的相关操作: cd, pwd, mkdir, rmdir 1.3 关於运行档路径的变量: $PATH ...

  6. RHCE学习笔记 管理1 (第六章 第七章)

    第六章 利用linux 文件系统权限文件访问 1.linux文件系统权限 文件的权限分为:  rwx  读/写/执行 ls -l  /home   查看/home下文件 ls -ld /home   ...

  7. Linux系统管理第五六七章 权限及归属管理 磁盘管理 文件系统与lvm

    第五六七章   alias 查看系统别名   67 chmod 设置文件或目录的权限 -R表示以递归的方式设置目录及目录下的所有子目录及文件的权限 u:属主 g:属组 o:其他人 a:所有人 +:添加 ...

  8. Testlink1.9.17使用方法(第七章 测试用例集管理)

    第七章 测试用例集管理 QQ交流群:585499566 测试用例准备好以后,可以对测试用例集进行相关的操作. 一. 添加测试用例到测试计划中 在主页的“当前测试计划”下拉列表里-->选择一个测试 ...

  9. C语言程序设计现代方法_基本类型(第七章)

    C语言支持两种不同的数值类型,整数类型,浮点类型. C语言的整数类型有不同的尺寸.int类型通常为32位,但在老的CPU上可能是16位.有些可能是64位. 因此,int型如果在16位CPU上最大值就是 ...

随机推荐

  1. ua实现类似 www.taobao.com 在手机上打开自动转变为 m.taobao.com 的域名转换

    user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.25 ...

  2. OC基础(7)

    封装 继承基本概念 继承相关特性 多态基本概念 多态的实现 *:first-child { margin-top: 0 !important; } body > *:last-child { m ...

  3. 【转贴】全站 HTTPS 来了

    http://geek.csdn.net/news/detail/48765 作者:腾讯TEG架构平台部静态加速组高级工程师 刘强 最近大家在使用百度.谷歌或淘宝的时候,是不是注意浏览器左上角已经全部 ...

  4. 慕课网-安卓工程师初养成-1-3 使用记事本编写Java程序

    来源:http://www.imooc.com/video/1501 step1: myProgram.java    源文件       使用记事本编辑 step2: compiler        ...

  5. mysql和oracle的mybatis操作

    1.Oracle.MySQL插入时返回下一个主键的操作 Oracle:<insert id="insert" parameterClass="ROLE"& ...

  6. centos 6.5 samba简单配置

    1.安装samba yum -y install samba  (我的显示已经安装啦!) 2.编辑samba的配置文件 vi /etc/samba/smb.conf 用 testparm查看我配置后的 ...

  7. hdu 3336【Count the string】(KMP)

    一道字符串匹配的题目,仅仅借此题练习一下KMP 因为这道题目就是要求用从头开始的n个字符串去匹配原来的字符串,很明显与KMP中求next的过程很相似,所以只要把能够从头开始匹配一定个数的字符串的个数加 ...

  8. Android控件大全(二)——Toolbar

    1.隐藏Actionbar 代码中设置:requestWindowFeature(Window.FEATURE_NO_TITLE)     //如果Activity是继承自AppCompatActiv ...

  9. phonegap android3.5.1 Crosswalk

    1. your phonegap platform for android update 3.5.1 cordova platform add android@3.5 2. download cros ...

  10. How to search compound files

    Last week my friend told me that she made a terrible mistake. She conducted raw serch and found no s ...