第七章 管理类型(In .net4.5) 之 使用类型
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);
* is 和 as 关键字,可以验证转换是否可行。如果仅判断不做实际转换,用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);
DynamicObject 和 ExpandoObject
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) 之 使用类型的更多相关文章
- 第六章 管理类型(In .net4.5) 之 创建类型
1. 概述 本章内容包括 C#5中如何更好的创建类型以及如何扩展现有类型. 2. 主要内容 2.1 如何选择类型 C#类型系统包括三种类型:值类型.引用类型.指针类型.(指针类型用于非托管代码,很少使 ...
- 网络操作系统 第七章 管理TCP/IP网络
本章小结 本章介绍了TCP/IP的相关概念,并且在此处基础上,介绍了Windows Server 2008中使用TCP/IP网络配置工具实现网络连接和管理的方法,在Linux系统中,讲解了是如何使用图 ...
- kubernetes第七章--管理存储资源
- 【转】第七章、Linux 文件与目录管理
原文网址:http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php 第七章.Linux 文件与目录管理 最近升级日期:2009/08/26 ...
- 第七章、Linux 文件与目录管理
第七章.Linux 文件与目录管理 1. 目录与路径 1.1 相对路径与绝对路径 1.2 目录的相关操作: cd, pwd, mkdir, rmdir 1.3 关於运行档路径的变量: $PATH ...
- RHCE学习笔记 管理1 (第六章 第七章)
第六章 利用linux 文件系统权限文件访问 1.linux文件系统权限 文件的权限分为: rwx 读/写/执行 ls -l /home 查看/home下文件 ls -ld /home ...
- Linux系统管理第五六七章 权限及归属管理 磁盘管理 文件系统与lvm
第五六七章 alias 查看系统别名 67 chmod 设置文件或目录的权限 -R表示以递归的方式设置目录及目录下的所有子目录及文件的权限 u:属主 g:属组 o:其他人 a:所有人 +:添加 ...
- Testlink1.9.17使用方法(第七章 测试用例集管理)
第七章 测试用例集管理 QQ交流群:585499566 测试用例准备好以后,可以对测试用例集进行相关的操作. 一. 添加测试用例到测试计划中 在主页的“当前测试计划”下拉列表里-->选择一个测试 ...
- C语言程序设计现代方法_基本类型(第七章)
C语言支持两种不同的数值类型,整数类型,浮点类型. C语言的整数类型有不同的尺寸.int类型通常为32位,但在老的CPU上可能是16位.有些可能是64位. 因此,int型如果在16位CPU上最大值就是 ...
随机推荐
- 在git上下载的Asp.Net MVC 4源码怎么编译?
以本人的下载位置为例:E:\aspnetwebstack 1.win+r 输入cmd 打开dos 界面 2.e: 回车,定位到e 盘 3.cd E:\aspnetwebstack 进入e 盘aspne ...
- 共享一个MVC通过NPOI导出excel的通用方法
public static System.IO.MemoryStream ExportExcel<T>(string title, List<T> objList, param ...
- 获取Repeater控件中的每一项数据
var items = rptList.Items;//获取Repeater控件的所有项 foreach (RepeaterItem item in items)//遍历每一项内容 { var t ...
- OC基础(2)
类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 *:first-child { margin-top: 0 !important; } body > *:last-c ...
- bochs安装一系列问题
http://blog.chinaunix.net/uid-23817499-id-3418083.html http://www.mouseos.com/os/tools/bochs.html ...
- 传智Java基础知识测试
共40道选择题,每题2.5分.多选题有错则全错,全对才满分. 单选题: 1. 下列哪个声明是错误的?(B) A. int i=10; B. float f=1.1; C. double ...
- 小巧的http live streaming m3u8播放器
转载请注明: TheViper http://www.cnblogs.com/TheViper 原来发表过一篇分段播放的flash播放器.这个播放器其实就没有神马原理,就是把一个视频分成好几个视频, ...
- size_t 与 int 区别
size_t是无符号的,并且是平台无关的,表示0-MAXINT的范围, 但是如果传入的是负数,会被编译成他的补码. size_t是标准规定的一个同义词,它的原始定义放在stddef.h里面,不同的环境 ...
- 在.net中序列化读写xml方法
收集XML的写法 XML是一种很常见的数据保存方式,我经常用它来保存一些数据,或者是一些配置参数. 使用C#,我们可以借助.net framework提供的很多API来读取或者创建修改这些XML, 然 ...
- XSS CSRF 攻击
XSS:跨站脚本(Cross-site scripting) CSRF:跨站请求伪造(Cross-site request forgery)定义: 跨网站脚本(Cross-site scripting ...