一本好书,或是一本比较有深度的书,就是每次研读的时候都会有新的发现。

好吧,我承认每次读的时候都有泛泛而过的嫌疑~~

这几年一直专注于C#客户端的开发,逐步从迷迷糊糊,到一知半解,再到自以为是,最后沉下心重新审视。也许这也是一种进步一种自我学习的过程。

前面啰嗦了这么多,希望大家也能不那么浮躁的“深入理解”C#这门语言的每个知识点。本文总结书本中的知识,在结合实际应用场合进行概述,如果有不正确的地方,还请不吝指教。

文章中的内容比较浅显,请高手略过此文。

1. 简化了的COM操作

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var Product = new List<Good>();
            Product.Add( });
            Product.Add( });
            Product.Add( });

            var app = new Microsoft.Office.Interop.Excel.Application() { Visible = false };
            Workbook wb = app.Workbooks.Add();
            Worksheet ws = app.ActiveSheet;
            ;
            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(一)的更多相关文章

  1. 温故知新---重读C#InDepth(二)

    一本好书,或是一本比较有深度的书,就是每次研读的时候都会有新的发现. 好吧,我承认每次读的时候都有泛泛而过的嫌疑~~ 这几年一直专注于C#客户端的开发,逐步从迷迷糊糊,到一知半解,再到自以为是,最后沉 ...

  2. Android Fragment使用(一) 基础篇 温故知新

    Fragment使用的基本知识点总结, 包括Fragment的添加, 参数传递和通信, 生命周期和各种操作. Fragment使用基础 Fragment添加 方法一: 布局里的标签 标识符: tag, ...

  3. JavaScript Module Pattern: In-Depth

    2010-03-12 JavaScript Module Pattern: In-Depth The module pattern is a common JavaScript coding patt ...

  4. 重读 code complete 说说代码质量

    重读code complete 说说代码质量 2014年的第一篇文章本来计划写些过去一年的总结和新年展望,但是因为还有一些事情要过一阵才能完成,所以姑且不谈这个,说说最近重读code complete ...

  5. 【温故知新】c#事件event

    从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...

  6. 【温故知新】C#委托delegate

    在c#的学习过程中,学到委托与事件总会迷糊一段时间,迷糊过后自然而就似懂非懂了~,所以最近我打算把以前所学的迷糊过的知识总结,温故知新,总结记录下来. 首先,我们来看一下msdn对委托的定义: del ...

  7. 记录android学习、开发过程温故知新

    记录android学习.开发过程温故知新

  8. 再回首,Java温故知新(一):Java概述

    Java发展历程 Java的发展要追溯到1991年,Patrick Naughton(帕特里克·诺顿)和James Gosling(詹姆斯·高斯林)带领Sun公司的工程师打算为有线电视转换盒之类的消费 ...

  9. 再回首,Java温故知新——开篇说明

    不知不觉在IT界从业2年了,两年时间足够一个人成长很多,当然也会改变很多事.在这两年时间里,随着对技术的深入了解,知识面的拓展以及工作难度的增大,渐渐的感觉自己技术方面根基不稳,多数问题也只是做到知其 ...

随机推荐

  1. Oracle数据加载之sqlldr工具的介绍

    环境: 服务端:RHEL6.4 + Oracle 11.2.0.4 客户端:WIN10 + Oracle 11.2.0.1 client 目录: sqlldr语法 sqlldr实验准备 sqlldr常 ...

  2. java基础知识--CLASSPATH

    如果在一个类中用到了另外一个类(new了一个新对象). package com.xxx.xxx; public class Cat { } //下面是另外的文件 public class Dog { ...

  3. 《Effective Java》—— 创建与销毁对象

    本篇主要总结的是<Effecticve Java>中关于创建和销毁对象的内容. 比如: 何时以及如何创建对象 何时以及如何避免创建对象 如何确保及时销毁 如何管理对象销毁前的清理动作 考虑 ...

  4. CentOS 7添加yum源

    RedHat下主要有两个distribution,一曰 RHEL(Red Hat Enterprise Linux) 一曰 Fedora.前者主要是供服务器使用,优点是稳定,缺点是老的掉牙,后者是供桌 ...

  5. 【学习笔记】Wireshark的用法

    计算机网络课上,需要我们灵活运用网络协议分析仪wireshark,最近一直在看,感觉有点难,并不是软件本身操作难,而是看懂一大群包的含义难,这个难主要也因为它是全英文的~~.. 好了,大致总结一下,基 ...

  6. 无法解析类型 javax.servlet.http.HttpServletRequest。从必需的 .class 文件间接引用

    java.lang.Error: 无法解析的编译问题: 无法解析类型 javax.servlet.http.HttpServletRequest.从必需的 .class 文件间接引用了它 无法解析类型 ...

  7. JSON序列化和反序列化的实例

    之前有项目中使用到了Json的序列化和反序列化,现在将使用的实例记录下来以备查阅.如有不妥,请指教. 代码的最终目的是得到一个符合 resultClass<List<rtnGetFindM ...

  8. Linux网络管理

    关于OSI七层模型.TCP五层模型.TCP的三次握手.HTTP协议.DNS解析等相关的网络基础知识请参考我整理的一篇博客:http://www.cnblogs.com/wxisme/p/4699049 ...

  9. Java Web中将oracle的数据库内容以表格形式展现到页面中(分页展示)

    分页SQL语句: ----分页显示 select * from (select rownum as r,t.* from () ; 查询的结果如下: 这个SQL,使用了三层嵌套的查询方式: 1)最内层 ...

  10. Myeclipse快捷键的使用

    存盘 Ctrl+s(肯定知道) 注释代码 Ctrl+/ 取消注释 Ctrl+\(Eclipse3已经都合并到Ctrl+/了) 代码辅助 Alt+/ 快速修复 Ctrl+1 代码格式化 Ctrl+Shi ...