第七章 管理类型(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上最大值就是 ...
随机推荐
- php 获取图片主要颜色的方法
本文章向码农们介绍php 获取图片主要颜色的方法,主要涉及php针对图片的相关操作技巧,需要的码农可以参考一下. $i = imagecreatefromjpeg("image.jpg&qu ...
- fw:学好Python必读的几篇文章
学好Python必读的几篇文章 from:http://blog.csdn.net/hzxhan/article/details/8555602 分类: python2013-01-30 11:52 ...
- Bootstrap 3 How-To #1 下载与配置
Bootstrap 3 发布了,通过简单的几步,我们就可以使用 Bootstrap 的样式表,图标,以及 javascript 来配置一个简单的站点. 准备 Bootstrap 不仅仅是一个代码集,还 ...
- MFC学习 文件操作注册表操作
c读写文件 void CFileView::OnRead() { FILE *pFile = fopen("1.txt", "r"); /*char ch[10 ...
- visual studio R6034解决方案集 从VC6.0 或VC2003 到VC2005发现的问题
这是我转的一篇非常全的帖子 能查到的解决方法都在里面有提及: 我是使用 stdafx.h加入这句 code #pragma comment(linker, "\"/manifest ...
- maya user guider第一课,一些基本概念
1.maya主要用于建模,动画, 视觉特效,游戏, 和模拟 一般分为以下几类: l 建模: ploygons, nurbs, subdivision surfaces 这是不同的建模方法. po ...
- jmeter随笔(8)--请求post的 数据为空
1.请求post的 数据为空 分析:发现是java 解决方法: 查看 2.获取文本中数据乱码问题 问题:文本保存为UTF-8编码格式 获取的数据乱码: 分析:这是编码格式的问题 解决办法: 将文件保存 ...
- Jquery 对象与 DOM对象的相互转换
在做 web 开发时,经常会用到 jquery 和 dom 对象, 有时候需要在这两个对象间进行切换. Jquery 对象 就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuer ...
- rsync安装使用
安装 yum install rsync mkdir /etc/rsyncd cd /etc/rsyncd vi rsyncd.conf pid file = /var/run/rsyncd.pid ...
- 洛谷P1206 [USACO1.2]回文平方数 Palindromic Squares
P1206 [USACO1.2]回文平方数 Palindromic Squares 271通过 501提交 题目提供者该用户不存在 标签USACO 难度普及- 提交 讨论 题解 最新讨论 暂时没有 ...