第七章 管理类型(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上最大值就是 ...
随机推荐
- Arrays
Arrays:用于操作数组对象的工具类,里面都是静态方法. asList方法:将数组转换成list集合. String[] arr = {"abc","kk", ...
- Appnium移动自动化框架初探
作者:cryanimal QQ:164166060 本文简要介绍了appnium自动化框架的架构.加载流程.支持语言.相关配置,以及元素定位工具等. 官方网站: http://appium.io Ap ...
- git添加文件过滤
操作流程 touch .gitignore vi .gitignore,添加需要过滤的文件或目录 git commit 出现问题 假如.gitignore里面添加file,而git库中已经存在file ...
- 【测试】通过RMAN联机全库备份,包括控制文件,归档日志文件,备份成功后,删除已备份的归档日志。
RMAN是一个很方便很好用的备份,恢复,还原的一个工具,做这个小测试其实只有一个RMAN语句就完全解决了这么大的需求: RMAN> backup as backupset full databa ...
- Swift 学习一函数&函数属性&懒加载
函数 函数相当于OC中的方法 格式: func 函数名(参数列表) -> 返回值类型 { 代码块 return 返回值} func 函数名(参数列表){ // 返回值为Void 可 ...
- 学习练习 java面向对象梯形面积
package com.hanqi; public class Ladder { double ShangDi; double XiaDi; double Gao; double MianJi; La ...
- jQuery Mask
<script type="text/javascript" src="/assets/mask/jquery.mask.min.js"></ ...
- 《Linux企业应用案例精解(第2版)》新书开始发售
<Linux企业应用案例精解(第2版)>新书开始发售 650) this.width=650;" title="linux企业应用案例精解 第2版" alt= ...
- 【Struts 2】Struts2环境搭建
一.关键步骤 1.创建Java Web项目 2.引入Struts2的依赖包,将依赖包拷贝到WEB-INF/lib下 * commons-logging-1.0.4.jar * freemarker-2 ...
- SVN与TortoiseSVN实战:TortoiseSVN新建及合并分支
硬广:<SVN与TortoiseSVN实战>系列已经写了两篇,第一篇<SVN与TortoiseSVN实战:从入门到精通>,关于分支和标签的知识介绍可翻阅第二篇<SVN与T ...