温故知新---重读C#InDepth(一)
一本好书,或是一本比较有深度的书,就是每次研读的时候都会有新的发现。
好吧,我承认每次读的时候都有泛泛而过的嫌疑~~
这几年一直专注于C#客户端的开发,逐步从迷迷糊糊,到一知半解,再到自以为是,最后沉下心重新审视。也许这也是一种进步一种自我学习的过程。
前面啰嗦了这么多,希望大家也能不那么浮躁的“深入理解”C#这门语言的每个知识点。本文总结书本中的知识,在结合实际应用场合进行概述,如果有不正确的地方,还请不吝指教。
文章中的内容比较浅显,请高手略过此文。
1. 简化了的COM操作
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- var Product = new List<Good>();
- Product.Add(new Good() { Name = "Tom", Age = });
- Product.Add(new Good() { Name = "Json", Age = });
- Product.Add(new Good() { Name = "Jacob", Age = });
- var app = new Microsoft.Office.Interop.Excel.Application() { Visible = false };
- Workbook wb = app.Workbooks.Add();
- Worksheet ws = app.ActiveSheet;
- int row = ;
- foreach (var good in Product)
- {
- ws.Cells[row, 1].Value = good.Name;
- ws.Cells[row, 2].Value = good.Age; // Dynamic C# 4.0 syntax
- row++;
- }
- wb.SaveAs(Filename: PractiseDemoLib.Util.RootPath + "Demo.xls", FileFormat: XlFileFormat.xlWorkbookNormal);
- app.Application.Quit();
- }
- public class Good
- {
- public string Name { get; set; }
- public Int32 Age { get; set; }
- }
程序中引入Microsoft.Office.Interop.Excel组件,如果没有可以下载,或者安装Excel即可。
这是C#4.0 语法的优雅表达式(红色字体部分),这样避免了之前十分啰嗦的实现方式,Dynamic语法不仅仅局限在这里,其在反射编程和与其他语音交互上有着“动态”的优势,在之后的篇幅中会有介绍。
2. 泛型约束
- public class A<T> where T : class ,IDisposable, new()
- {
- public string Name { get; set; }
- }
- public class A<T, U>
- where T : class ,IDisposable, new()
- where U : class,T
- {
- public string Name { get; set; }
- }
- /*
- * 不能约束的例子
- * Class B<T> : where T : Object, System.Enum, System.ValueType, System.Delegate
- * * */
泛型的出现更多的是为了解决装箱和拆箱的效率问题,并且利用泛型,程序得到更大程度的复用。而泛型约束就是约束输入类型的类型,使其应该具有某类型的方法或属性。
这里有几点要注意下:
1. 类型T可以约束成class,接口类型等,但不能约束成where T : Object, System.Enum, System.ValueType, System.Delegate。
2. 类型T的构造必须是无参构造函数(CLR并未有此约束,所以通过某些方式依然可以构建,只不过不是IDE模式下),即约束成new T() 模式,并且new() 要放在约束列表的最后。
3. 类型T可以被约束成类型U。
3. 静态类型嵌套
涉及到静态类型需要重点区分的是静态类型和实例类型,静态的构造和实例的构造。
- public class Outer<T>
- {
- public class Inner<U, V>
- {
- readonly static int HashCode;
- static bool IsInit = false;
- static Inner()
- {
- HashCode = typeof(Outer<T>).GetHashCode();
- }
- public static void DynamicMethod(object sender)
- {
- var win = sender as MainWindow;
- win.OutPutMsg(string.Format("[{4},{3}] Outer<{0}>.Inner<{1},{2}>", typeof(T), typeof(U), typeof(V), HashCode.ToString(), IsInit.ToString()));
- IsInit = true;
- }
- }
- }
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- Outer<int>.Inner<string, DateTime>.DynamicMethod(this);
- Outer<string>.Inner<int, int>.DynamicMethod(this);
- Outer<object>.Inner<string, int>.DynamicMethod(this);
- Outer<int>.Inner<string, DateTime>.DynamicMethod(this);
- }
这个例子主要演示的是静态构造函数只唯一初始化一回,这样就导致了当点击Button_Click之后,只会初始化三回对象,因为第一组和第四组,程序认为输入参数都相同,只初始化一回静态构造。
- [False,] Outer<System.Int32>.Inner<System.String,System.DateTime>
- [False,] Outer<System.String>.Inner<System.Int32,System.Int32>
- [False,] Outer<System.Object>.Inner<System.String,System.Int32>
- [True,] Outer<System.Int32>.Inner<System.String,System.DateTime>
上面就是显示结果,大家可以对比下代码。
持续更新:示例代码下载
温故知新---重读C#InDepth(一)的更多相关文章
- 温故知新---重读C#InDepth(二)
一本好书,或是一本比较有深度的书,就是每次研读的时候都会有新的发现. 好吧,我承认每次读的时候都有泛泛而过的嫌疑~~ 这几年一直专注于C#客户端的开发,逐步从迷迷糊糊,到一知半解,再到自以为是,最后沉 ...
- Android Fragment使用(一) 基础篇 温故知新
Fragment使用的基本知识点总结, 包括Fragment的添加, 参数传递和通信, 生命周期和各种操作. Fragment使用基础 Fragment添加 方法一: 布局里的标签 标识符: tag, ...
- JavaScript Module Pattern: In-Depth
2010-03-12 JavaScript Module Pattern: In-Depth The module pattern is a common JavaScript coding patt ...
- 重读 code complete 说说代码质量
重读code complete 说说代码质量 2014年的第一篇文章本来计划写些过去一年的总结和新年展望,但是因为还有一些事情要过一阵才能完成,所以姑且不谈这个,说说最近重读code complete ...
- 【温故知新】c#事件event
从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...
- 【温故知新】C#委托delegate
在c#的学习过程中,学到委托与事件总会迷糊一段时间,迷糊过后自然而就似懂非懂了~,所以最近我打算把以前所学的迷糊过的知识总结,温故知新,总结记录下来. 首先,我们来看一下msdn对委托的定义: del ...
- 记录android学习、开发过程温故知新
记录android学习.开发过程温故知新
- 再回首,Java温故知新(一):Java概述
Java发展历程 Java的发展要追溯到1991年,Patrick Naughton(帕特里克·诺顿)和James Gosling(詹姆斯·高斯林)带领Sun公司的工程师打算为有线电视转换盒之类的消费 ...
- 再回首,Java温故知新——开篇说明
不知不觉在IT界从业2年了,两年时间足够一个人成长很多,当然也会改变很多事.在这两年时间里,随着对技术的深入了解,知识面的拓展以及工作难度的增大,渐渐的感觉自己技术方面根基不稳,多数问题也只是做到知其 ...
随机推荐
- 探索 OpenStack 之(10):深入镜像服务Glance
本篇博文来探讨下镜像服务Glance. 0. 基本概念 0.1 基本功能 Glance提供REST API来支持以下镜像操作: 查询 注册 上传 获取 删除 访问权限管理 0.2 Glance RE ...
- hdu1047 Integer Inquiry
/* Integer Inquiry Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- html之大白
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Codeforces Round #370 (Div. 2)B. Memory and Trident
地址:http://codeforces.com/problemset/problem/712/B 题目: B. Memory and Trident time limit per test 2 se ...
- 2014 Super Training #10 C Shadow --SPFA/随便搞/DFS
原题: FZU 2169 http://acm.fzu.edu.cn/problem.php?pid=2169 这题貌似有两种解法,DFS和SPFA,但是DFS怎么都RE,SPFA也要用邻接表表示边, ...
- POJ 3481Double Queue Splay
#include<stdio.h> #include<string.h> ; ],data[N],id[N],fa[N],size,root; void Rotate(int ...
- 深入理解maven及应用--转
(一):生命周期和插件 在项目里用了快一年的maven了,最近突然发现maven项目在eclipse中build时非常慢,因为经常用clean install命令来build项目,也没有管那么多,但最 ...
- java 19 -15 File类批量更改文件名的方法
/* 需求: * 把H:\三国演义下面的视频名称修改为 00?_介绍.avi 思路: A:封装目录 B:获取该目录下所有的文件的File数组 C:遍历该File数组,得到每一个File对象 D:拼接一 ...
- SQL 第一范式、第二范式、第三范式、BCNF
作者 : Dolphin 原文地址: http://blog.csdn.net/qingdujun/article/details/27365979 一.第一范式 1NF 要求:每一个分量必须是不可分 ...
- Gradle的HelloWorld
Gradle的脚本名为 build.gradle task hello{ doLast{ println("Hello World") } } 运行:gradle -q hell ...