读书笔记: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             //Test4();
 16             //Test5();
 17             //Test6();
 18             //A.Test7();
 19             //B.Test7();
 20             //B.Test8();
 21             //Test9();
 22             //C.Test10();
 23             //D.Test10();
 24             //E.Test10();
 25         }
 26
 27         //接口:
 28         //对一组方法签名进行了统一命名
 29         //定义了在类型之间进行沟通的标准方式
 30
 31         //13.3 接口定义和实现
 32         //定义接口(该定义已包含在FCL中)
 33         //public interface IComparable<in T>  // in 逆变量,即允许 object -> string
 34         //{
 35         //    int CompareTo(T other);
 36         //}
 37
 38         //实现接口
 39         public sealed class Point : IComparable<Point>
 40         {
 41             private int m_x, m_y;
 42             public Point(int x, int y)
 43             {
 44                 m_x = x;
 45                 m_y = y;
 46             }
 47             //1). 必须标记为public
 48             //2). 编译器总是将其标记为virtual,但派生类不能重写sealed类的接口方法
 49             //3). 但派生类可以重写继承同一接口,并为接口方法提供自己的实现
 50             //IL代码:.method public final hidebysig newslot virtual
 51             public int CompareTo(Point other)
 52             {
 53                 return Math.Sign(Math.Sqrt(m_x * m_x + m_y * m_y) -
 54                     Math.Sqrt(other.m_x * other.m_x + other.m_y * other.m_y));
 55             }
 56         }
 57
 58         //13.5 显示/隐式实现接口
 59
 60         internal sealed class SimpleType : IDisposable
 61         {
 62             //隐式实现接口
 63             public void Dispose()
 64             {
 65                 Console.WriteLine("Public Dispose");
 66             }
 67             //显示实现接口,不能定义访问修饰符,总是private
 68             //IL代码:.method private final hidebysig newslot virtual
 69             void IDisposable.Dispose()
 70             {
 71                 Console.WriteLine("IDisposable Dispose");
 72             }
 73         }
 74         static void Test1()
 75         {
 76             SimpleType st = new SimpleType();
 77             st.Dispose();
 78             IDisposable d = st;
 79             d.Dispose();  //若为显示实现接口,结果为 Public Dispose
 80         }
 81
 82         //13.6 泛型接口
 83
 84         //非泛型接口
 85         static void Test2()
 86         {
 87             int x = 1, y = 2;
 88             IComparable c = x;
 89             c.CompareTo(y);  //发生装箱
 90             //c.CompareTo("2");  //运行时异常
 91         }
 92         //泛型接口
 93         static void Test3()
 94         {
 95             int x = 1, y = 2;
 96             IComparable<int> c = x;
 97             c.CompareTo(y);  //不发生装箱
 98             //c.CompareTo("2");  //编译错误
 99         }
100
101         //实现同一个接口的多个泛型版本
102         public sealed class Number : IComparable<int>, IComparable<string>
103         {
104             private int m_val = 5;
105             public int CompareTo(int other)
106             {
107                 return m_val.CompareTo(other);
108             }
109             public int CompareTo(string other)
110             {
111                 return m_val.CompareTo(other);
112             }
113         }
114
115         //13.7 约束方法的参数类型为实现指定接口的类型
116         static void Test4()
117         {
118             int x = 5;
119             Guid g = new Guid();
120             M(x);  //int 同时实现了 IComparable 和 IConvertible
121             //M(g);  //编译错误,guid没有实现IConvertible
122         }
123         static int M<T>(T t) where T : IComparable, IConvertible
124         {
125             return 0;
126         }
127
128         //13.8 一个类实现不同接口的重签名方法
129         //1). 定义接口
130         public interface IWindow
131         {
132             object GetMenu();
133         }
134         public interface IRestaurant
135         {
136             object GetMenu();
137         }
138         //2). 隐式实现接口
139         public sealed class MarioPizzeria : IWindow, IRestaurant
140         {
141             public object GetMenu()   //书中“必须使用显式接口方法实现”说法是错误的,可同时实现两个接口!
142             {
143                 Console.WriteLine("0");
144                 return "0";
145             }
146         }
147         static void Test5()
148         {
149             MarioPizzeria mp = new MarioPizzeria();
150             mp.GetMenu();
151             IWindow window = mp;
152             window.GetMenu();
153             IRestaurant restaurant = mp;
154             restaurant.GetMenu();
155         }
156         //3). 显式实现接口
157         public sealed class MarioPizzeria2 : IWindow, IRestaurant
158         {
159             public object GetMenu()
160             {
161                 Console.WriteLine("0");
162                 return "0";
163             }
164             object IWindow.GetMenu()
165             {
166                 Console.WriteLine("1");
167                 return "1";
168             }
169             object IRestaurant.GetMenu()
170             {
171                 Console.WriteLine("2");
172                 return "2";
173             }
174         }
175         static void Test6()
176         {
177             MarioPizzeria2 mp = new MarioPizzeria2();
178             mp.GetMenu();   //GetMenu()只是该类的一个普通方法,若未实现则出现编译错误
179             IWindow window = mp;
180             window.GetMenu();
181             IRestaurant restaurant = mp;
182             restaurant.GetMenu();
183         }
184
185         //13.9 用显式接口方法实现来增强编译时类型安全
186         //原理是显式实现接口只能“显式”调用
187         //1). 隐式实现接口可能发生装箱和运行时异常
188         class A
189         {
190             public interface IComparable1
191             {
192                 int CompareTo(object other);
193             }
194             struct SomeValueType : IComparable1
195             {
196                 private int m_x;
197                 public SomeValueType(int x) { m_x = x; }
198                 public int CompareTo(object other)
199                 {
200                     return m_x - ((SomeValueType)other).m_x;
201                 }
202             }
203             public static void Test7()
204             {
205                 SomeValueType v = new SomeValueType(0);
206                 object o = new object();
207                 int n = v.CompareTo(v);   //装箱 SomeValueType -> Object
208                 //n = v.CompareTo(o);  //运行时异常
209             }
210         }
211         //2). 显式实现接口不发生装箱和编译时类型安全
212         class B
213         {
214             public interface IComparable1
215             {
216                 int CompareTo(object other);
217             }
218             struct SomeValueType : IComparable1
219             {
220                 private int m_x;
221                 public SomeValueType(int x) { m_x = x; }
222                 public int CompareTo(SomeValueType other)
223                 {
224                     return m_x - other.m_x;
225                 }
226                 int IComparable1.CompareTo(object other)
227                 {
228                     return CompareTo((SomeValueType)other);
229                 }
230             }
231             public static void Test7()
232             {
233                 SomeValueType v = new SomeValueType(0);
234                 object o = new object();
235                 int n = v.CompareTo(v);   //不发生装箱
236                 //n = v.CompareTo(o);  //编译错误,因为显式接口只能显式调用
237             }
238             //3). 重新发生装箱和运行时异常
239             public static void Test8()
240             {
241                 SomeValueType v = new SomeValueType(0);
242                 IComparable1 c = v;  //装箱 struct -> 引用类型
243                 object o = new object();
244                 int n = c.CompareTo(v);  //装箱 引用类型 -> object
245                 //n = c.CompareTo(o);  //编译异常
246             }
247         }
248
249         //13.10 显式实现接口缺陷
250         public static void Test9()
251         {
252             int x = 5;
253             //1). In32显式实现了IConvertible接口,但此处没有相关帮助
254             //Single s = x.ToSingle(null);
255             //2). Int32值型转换为IConvertible发生装箱
256             Single s = ((IConvertible)x).ToSingle(null);
257         }
258         class C
259         {
260             public static void Test10()
261             {
262                 var d1 = new Derived();
263                 var d2 = new Derived();
264                 d1.CompareTo(d2);
265             }
266             internal class Base : IComparable
267             {
268                 int IComparable.CompareTo(object obj)
269                 {
270                     Console.WriteLine("Base‘s CompareTo");
271                     return 0;
272                 }
273             }
274             internal sealed class Derived : Base, IComparable
275             {
276                 public int CompareTo(object o)
277                 {
278                     Console.WriteLine("Derived‘s CompareTo");
279
280                     //没有CompareTo方法
281                     //base.CompareTo(o);
282
283                     //IComparable c = this;  //this实现了IComparable接口
284                     //c.CompareTo(o);  //所以此处在调用自身导致无穷递归
285
286                     return 0;
287                 }
288             }
289         }
290         class D
291         {
292             public static void Test10()
293             {
294                 var d1 = new Derived();
295                 var d2 = new Derived();
296                 d1.CompareTo(d2);
297             }
298             internal class Base : IComparable
299             {
300                 int IComparable.CompareTo(object obj)
301                 {
302                     Console.WriteLine("Base‘s CompareTo");
303                     return 0;
304                 }
305             }
306             internal sealed class Derived : Base/*, IComparable*/
307             {
308                 public int CompareTo(object o)
309                 {
310                     Console.WriteLine("Derived‘s CompareTo");
311
312                     //没有CompareTo方法
313                     //base.CompareTo(o);
314
315                     //调用显式接口方法
316                     IComparable c = this;
317                     c.CompareTo(o);
318
319                     return 0;
320                 }
321             }
322         }
323         class E
324         {
325             public static void Test10()
326             {
327                 var d1 = new Derived();
328                 var d2 = new Derived();
329                 d1.CompareTo(d2);
330             }
331             internal class Base : IComparable
332             {
333                 int IComparable.CompareTo(object obj)
334                 {
335                     Console.WriteLine("Base‘s CompareTo");
336                     return 0;
337                 }
338                 public virtual int CompareTo(object o)
339                 {
340                     Console.WriteLine("Base‘s virtual CompareTo");
341                     return 0;
342                 }
343             }
344             internal sealed class Derived : Base, IComparable
345             {
346                 public override int CompareTo(object o)
347                 {
348                     Console.WriteLine("Derived‘s CompareTo");
349                     //此处调用的是虚方法,而非接口的显式实现方法
350                     return base.CompareTo(o);
351                 }
352             }
353         }
354
355     }
356 }

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

时间: 2024-11-09 06:29:39

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

读书笔记: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.Test

读书笔记—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修饰 事件的编码建议 使用

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

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

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