读书笔记:CLR var C# 第12章

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using System.Linq;
  5 using System.Text;
  6
  7 namespace ClrVarCSharp.C12Generic
  8 {
  9     class Program
 10     {
 11         public static void Main(string[] args)
 12         {
 13             //A.Test1();
 14             //B.Test2();
 15             //C.Test2();
 16             //Test3();
 17             //Test4();
 18             //Test5();
 19
 20         }
 21
 22         //12.2.1 开放类型和封闭类型
 23         public sealed class DictionaryStringKey<TValue> : Dictionary<string, TValue> { }
 24         public static class A
 25         {
 26             public static void Test1()
 27             {
 28                 object o = null;
 29
 30                 Type t = typeof(Dictionary<,>);
 31                 o = CreateInstance(t);  //创建开放类型实例失败
 32                 Console.WriteLine();
 33
 34                 t = typeof(DictionaryStringKey<>);  //开放类型
 35                 o = CreateInstance(t);
 36                 Console.WriteLine();
 37
 38                 t = typeof(DictionaryStringKey<Guid>);
 39                 o = CreateInstance(t);
 40                 Console.WriteLine(o.GetType());
 41
 42             }
 43
 44             private static object CreateInstance(Type t)
 45             {
 46                 object o = null;
 47                 try
 48                 {
 49                     o = Activator.CreateInstance(t);
 50                     Console.WriteLine("已创建 {0} 的实例。", t.ToString());
 51                 }
 52                 catch (ArgumentException e)
 53                 {
 54                     Console.WriteLine(e.Message);
 55                 }
 56                 return o;
 57             }
 58         }
 59
 60         //12.2.2 泛型类型和继承
 61         //该链表只能接受一种类型
 62         class B
 63         {
 64             sealed class Node<T>
 65             {
 66                 public T m_data;
 67                 public Node<T> m_next;
 68                 public Node(T data) : this(data, null)
 69                 {
 70
 71                 }
 72                 public Node(T data, Node<T> next)
 73                 {
 74                     m_data = data;
 75                     m_next = next;
 76                 }
 77                 public override string ToString()
 78                 {
 79                     return m_data.ToString() +
 80                         ((m_next != null) ? m_next.ToString() : string.Empty);
 81                 }
 82             }
 83             public static void Test2()
 84             {
 85                 Node<char> head = new Node<char>(‘C‘);
 86                 head = new Node<char>(‘B‘, head);
 87                 head = new Node<char>(‘A‘, head);
 88                 Console.WriteLine(head.ToString());
 89             }
 90         }
 91         //该链表可接受不同的类型
 92         class C
 93         {
 94             class Node
 95             {
 96                 protected Node m_next;
 97                 public Node(Node next)
 98                 {
 99                     m_next = next;
100                 }
101             }
102             sealed class TypeNode<T> : Node
103             {
104                 public T m_data;
105                 public TypeNode(T data) : this(data, null)
106                 {
107
108                 }
109                 public TypeNode(T data, Node next) : base(next)
110                 {
111                     m_data = data;
112                 }
113                 public override string ToString()
114                 {
115                     return m_data.ToString() +
116                         ((m_next != null) ? m_next.ToString() : string.Empty);
117                 }
118             }
119             public static void Test2()
120             {
121                 Node head = new TypeNode<char>(‘.‘);
122                 head = new TypeNode<DateTime>(DateTime.Now, head);
123                 head = new TypeNode<string>("Today is ", head);
124                 Console.WriteLine(head.ToString());
125             }
126         }
127
128         //12.2.3 泛型类型同一性
129         List<DateTime> dt1 = new List<DateTime>();
130         internal sealed class DateTimeList : List<DateTime> { /* 内部无需任何代码 */ }  //DateTimeList与DateTime是两个不同的类型
131         //using DateTimeList = System.Collections.Generic.List<System.DateTime>;  //简化代码又保证是同一类型
132         static void Test3()
133         {
134             DateTimeList dt2 = new DateTimeList();  //通过以上定义,简化了<>
135             bool sameType = (typeof(List<DateTime>) == typeof(DateTimeList));
136             Console.WriteLine(sameType);
137         }
138
139         //12.6 泛型方法
140         sealed class GenericType<T>
141         {
142             private T m_value;
143             public GenericType(T value) { m_value = value; }
144             public TOutput Converter<TOutput>()
145             {
146                 TOutput result = (TOutput)Convert.ChangeType(m_value, typeof(TOutput));
147                 return result;
148             }
149         }
150
151         private static void Swap<T>(ref T o1, ref T o2)
152         {
153             T temp = o1;
154             o1 = o2;
155             o2 = temp;
156         }
157
158         //12.8 可验证性和约束
159         public static T Min<T>(T o1, T o2) where T : IComparable<T>
160         {
161             if (o1.CompareTo(o2) < 0)
162                 return o1;
163             return o2;
164         }
165
166         static void Test4()
167         {
168             object o1 = "X2009";
169             object o2 = "abc";
170             //object oMin = Min<object>(o1, o2);  //编译错误
171         }
172
173         //泛型类型/方法重载
174         //只能定义基于参数数量的重载
175         sealed class AType { }
176         sealed class AType<T> { }
177         sealed class AType<T1, T2> { }
178         //不能定义仅基于约束的重载
179         //sealed class AType<T> where T : IComparable<T> { }
180         //不能定义基于名称的重载
181         //sealed class AType<T3, T4> { }
182
183         //12.8.1 主要约束,约束为非密封类的一个引用类型
184         sealed class PrimaryConstraintOfStream<T> where T : Stream
185         {
186             public void M(T stream)
187             {
188                 stream.Close();
189             }
190         }
191         //12.8.2 次要约束,约束为接口类型
192
193         //用一个泛型来约束另一个泛型:指定参数是约束类型或其派生类型
194         static List<T2> ConvertIList<T1, T2>(IList<T1> list) where T1 : T2
195         {
196             List<T2> baseList = new List<T2>(list.Count);
197             for (int index = 0; index < list.Count; index++)
198             {
199                 baseList.Add(list[index]);
200             }
201             return baseList;
202         }
203
204         static void Test5()
205         {
206             IList<string> ls = new List<string>();
207             ls.Add("A String");
208
209             //IList<string>转换为IList<object>
210             IList<object> lo = ConvertIList<string, object>(ls);
211
212             IList<IComparable> lc = ConvertIList<string, IComparable>(ls);
213
214             IList<IComparable<string>> lcs = ConvertIList<string, IComparable<string>>(ls);
215
216             IList<string> ls2 = ConvertIList<string, string>(ls);
217
218             //IList<Exception> le = ConvertIList<string, Exception>(ls);
219         }
220
221         //12.8.3 构造器约束
222         sealed class ConstructorConstraint<T> where T : new()
223         {
224             public static T Factory()
225             {
226                 return new T();
227             }
228         }
229
230         //12.8.4 其他可验证性问题
231        //1). 泛型的类型转换
232         static void Test6<T>(T obj)
233         {
234             //编译错误
235             //int x = (int)obj;
236             //string s = (string)obj;
237         }
238
239         static void Test7<T>(T obj)
240         {
241             //可通过编译,但可能出现运行时异常
242             int x = (int)(object)obj;
243             string s = (string)(object)obj;
244         }
245
246         static void Test8<T>(T obj)
247         {
248             //无错误
249             string s = obj as string;
250         }
251
252         //2). 泛型初始化
253         static void Test9<T>()
254         {
255             //T temp = null;
256             T temp = default(T);
257         }
258
259     }
260 }

原文地址:https://www.cnblogs.com/x2009/p/8687706.html

时间: 2024-10-13 04:49:03

读书笔记:CLR var C# 第12章的相关文章

读书笔记—CLR via C#章节1-2

这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享. 程序集 描述:一个或多个类型定义文件及资源文件的集合 特征:可重用.可保护.可版本控制的单元 生成:可通过C#编译器(或其他编译器)或AL.exe生成 组成: 托管模块(module) PE头,PE32或PE32+,面向CPU架构的信息 CLR头,

读书笔记:CLR var C# 第13章

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ClrVarCSharp.C13Interface 7 { 8 class Program 9 { 10 public static void Main(string[] args) 11 { 12 //Test1(); 13 //Test2(); 14 //Test3(); 15

读书笔记—CLR via C#线程25-26章节

前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 线程 线程内部组成 线程内核对象 thread kernel object,在该结构中,包含一组对线程进行描述的属性.数据结构中还包括所谓的线程上下文thread context.上下文是一个内存块,包含了CPU的寄存器集合,占用几百到几千个字

读书笔记—CLR via C#章节3

这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享. 强命名程序集 优点 程序集共享 版本共存,解决DLL hell 安全策略(防篡改) 发布策略控制 标识组成 文件名(不计扩展名)+版本号+语言文化+公钥 CLR加载方式 弱命名程序集私有部署,CLR在基目录或子目录中搜索时只使用程序集名称 CLR搜

读书笔记—CLR via C#线程27章节

前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 同步IO执行过程,拿Read举例 托管代码转变为本地用户模式代码,Read在内部调用Win32的ReadFile函数 ReadFile分配IRP(IO Request Packet) IRP包括:一个文件句柄.文件偏移量.Byte[]数组 IO

读书笔记—CLR via C#同步构造28-29章节

前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 类库和线程安全 在类设计中,类和方法的线程安全的设计尽量和FCL保持一致 保证所有的静态方法都是线程安全的 不保证实例方法是线程安全的 基元用户模式和基元内核模式构造 用户模式构造 易失构造(volatile construct),它包含一个简

读书笔记—CLR via C#反射

前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 程序集加载 AppDomain.Load 尽量避免使用此方法加载程序集,因为Assembly不是从System.MarshalByRefObject派生,所以程序集对象必须按值封送回发出调用的那个AppDomain,但是CLR会使用发出调用的那

读书笔记—CLR via C#章节11-13

前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 事件 事件的本质 初始化为null的私有委托字段 封装add_Event和remove_Event方法 add_Event和remove_Event的可访问性同Event字段的可访问性,包括virtual和static修饰 事件的编码建议 使用

R in action读书笔记(5)-第七章:基本统计分析

7.1描述性统计分析 > vars<-c("mpg","hp","wt") > head(mtcars[vars])                    mpg  hp    wt Mazda RX4         21.0 110 2.620 Mazda RX4 Wag     21.0 110 2.875 Datsun 710        22.8  93 2.320 Hornet 4 Drive    21.4 11