第七章 管理类型(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上最大值就是 ...
随机推荐
- css列表
列表是有三种形式: 1.无序列表,用来表示一个列表语义,并且每个项目与项目之间是不分先后顺序的 ul 的英文unordered list "无序列表" li 的英文 list ...
- Python和Django在Windows上的环境搭建
作为一个.NET程序员,真心不喜欢Python以及PHP这种松散的语法.有人说,程序员应该多学几门语言,本想学习Java,无奈感觉Java的语法太啰嗦了.很多人都推荐Python,说它的语法简洁,执行 ...
- win7下Oracle 11的安装
把下载的win32_11gR2_database_1of2.zip和win32_11gR2_database_2of2.zip解压到一个database文件夹下,运行安装文件 Oracle11的卸 ...
- Swift 学习一函数&函数属性&懒加载
函数 函数相当于OC中的方法 格式: func 函数名(参数列表) -> 返回值类型 { 代码块 return 返回值} func 函数名(参数列表){ // 返回值为Void 可 ...
- JS实现电子时钟
目前有个小项目,在首页头部导航栏里需要一个电子时钟的效果,于是我就采用如下代码实现了一个电子时钟的效果.不过不完美,第一种方式容易导致网页莫名其妙的异常,后来觉得可能是做的操作太多了,然后 ...
- BZOJ 1036 树的统计-树链剖分
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
- android反编译工具总结
序:总结反编译主要的目的在于学习.利用反编译进行相关的汉化或修改,都是不道德的! 大家都知道,将apk文件解压后有两部分文件需要处理,一种是xml文件,另一种一个dex文件(.dex),我们可以从.d ...
- java 中的fanal
三.java中有final final 修饰符 关键字可用于修饰类,变量和方法,final关键字有点类似于C#里的sealed 关键字,用于表示它修饰的类,方法和变量不可改变. fina修饰变量时,表 ...
- 揭秘TPM安全芯片技术及加密应用
揭秘TPM安全芯片技术及加密应用 首发:http://safe.it168.com/a2012/0912/1396/000001396884.shtml 从2003年开始,重要数据丢失已经成为严重的信 ...
- a mystrious max subquence sum
#include<cstdio>#include<cstring>const int maxn=100005;int buf[maxn];int main(){ freopen ...