• 温故知新---重读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 = 21 });
                Product.Add(new Good() { Name = "Json", Age = 22 });
                Product.Add(new Good() { Name = "Jacob", Age = 26 });
    
    
                var app = new Microsoft.Office.Interop.Excel.Application() { Visible = false };
                Workbook wb = app.Workbooks.Add();
                Worksheet ws = app.ActiveSheet;
                int row = 1;
                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,29514189] Outer<System.Int32>.Inner<System.String,System.DateTime>
    [False,53070131] Outer<System.String>.Inner<System.Int32,System.Int32>
    [False,39345664] Outer<System.Object>.Inner<System.String,System.Int32>
    [True,29514189] Outer<System.Int32>.Inner<System.String,System.DateTime>

    上面就是显示结果,大家可以对比下代码。

    持续更新:示例代码下载

  • 相关阅读:
    RabbitMQ笔记-死信队列与延时队列
    设计模式-迭代器模式
    RabbitMQ笔记-Demo(C#)
    RabbitMQ笔记-消息追踪【未完成】
    RabbitMQ笔记-安装&命令
    RabbitMQ笔记-Exchange、Queue、Message详细说明
    MySQL笔记-MVCC【没写】
    MySQL笔记-基础知识
    多线程笔记-基础知识
    在Redis中进行分页排序查询【转】
  • 原文地址:https://www.cnblogs.com/cuiyansong/p/3855953.html
Copyright © 2020-2023  润新知