本篇已收录至《C#图解教程》读书笔记目录贴,点击访问该目录可获取更多内容。

一、接口那点事儿

  (1)什么是接口?

  一组函数成员而未实现的引用类型。只有类和结构能实现接口。

  (2)从IComparable接口看接口实例:

  假设有如下一段代码,它使用Array类的一个静态方法Sort对一个未排序的int类型数组进行排序,并输出排序后的结果。

using System;class Program
{static void Main(){var myInt = new[] { 20, 4, 16, 9, 2 };       // Create an array of ints.
Array.Sort( myInt );                         // Sort elements by magnitude.foreach ( var i in myInt )                   // Print them out.Console.Write( "{0} ", i );}
}

  Sort方法在int类型数组的排序工作上做的很好,但是如果我们尝试在自定义的类上使用就会发生异常,例如下面的MyClass类。

class MyClass
{public int TheValue;
}

  Sort为何不能对MyClass进行排序,原因在于:它不知道如何比较自定义对象及如何进行排序。Array类的Sort方法其实依赖于一个IComparable的接口,它声明在BCL中,包含唯一的CompareTo方法。它接收一个object类型的参数,可以匹配任何引用类型。

public interface IComparable
{int CompareTo(object obj);
}

  这下,我们知道了int类型默认实现了IComparable接口,而我们的MyClass则没有。因此,我们需要将MyClass实现这个IComparable接口。

class MyClass : IComparable
{public int TheValue;public int CompareTo( object obj )                 {MyClass mc = (MyClass) obj;if ( this.TheValue < mc.TheValue )return -1;if ( this.TheValue > mc.TheValue )return 1;return 0;}
}

  现在,MyClass类实现了IComparable接口,它可以用于Sort方法了。

class Program
{static void PrintOut( string s, MyClass[] mc ){Console.Write( s );foreach ( var m in mc )Console.Write( "{0} ", m.TheValue );Console.WriteLine( "" );}static void Main(){var myInt = new[] { 20, 4, 16, 9, 2 };MyClass[] mcArr = new MyClass[5];               for ( int i = 0; i < 5; i++ )                   {mcArr[i] = new MyClass();mcArr[i].TheValue = myInt[i];}PrintOut( "Initial Order: ", mcArr );           Array.Sort( mcArr );                            PrintOut( "Sorted Order:  ", mcArr );           }
}

  现在,一个完整的接口实例已经完毕。

  (3)使用接口注意事项:

    ①声明接口时:不能包含:数据成员、静态成员;只能声明:方法、属性、事件、索引器;

TIP:接口允许有任何的访问修饰符,但是接口成员是隐式public的,不允许有任何的访问修饰符,包括public。

    ②实现接口时:在基类列表中包括接口名称;为每一个接口的成员实现接口;

  (4)接口是一种引用类型:我们不能直接通过类或对象的成员访问接口,然而,我们可以通过把类对象转换成接口类型来获取指向接口的引用。一旦有了接口的引用,我们就可以使用点号来调用接口的方法。

using System;interface IIfc1
{void PrintOut( string s );
}class MyClass : IIfc1
{public void PrintOut( string s ){Console.WriteLine( "Calling through:  {0}", s );}
}class Program
{static void Main(){MyClass mc = new MyClass();         mc.PrintOut( "object" );           IIfc1 ifc = (IIfc1) mc;            ifc.PrintOut( "interface" );       }
}

  下面我们看看上面的代码在内存中的分配:

  (5)接口和as运算符=>天生一对

  在以往使用接口引用时,我们往往会使用强制类型转换,但强制类型转换会抛出异常(异常是指代码中的意外错误,它会严重降低代码速度)。如何避免这个问题,我们可以使用as运算符,在类对象未实现接口时不会抛出异常,只会返回null。

二、看我72变:转换

  (1)本质:接受一个类型的值并使用它作为另一个类型的等价值的过程

  (2)转换分类:

  ①预定义的转换:数字、装箱/拆箱、引用转换;

  数字类型的转换详见下图:

  装箱/拆箱是一个比较重要的点,现在我们来看看:

  装箱(boxing)是值类型->引用类型,本质其实是创建副本。装箱是一种隐式转换,它接收值类型的值,根据这个值在在堆上创建一个完整的引用类型对象并返回对象引用。

  拆箱(unboxing)是引用类型->值类型,本质把装箱后的对象转换回值类型。拆箱是显示转换。

  ②用户自定义的转换:隐式和显示的自定义转换;

using System;class Person
{public string Name;public int Age;public Person( string name, int age ){Name = name;Age = age;}public static implicit operator int( Person p ) {return p.Age;}public static implicit operator Person( int i ) {return new Person( "Nemo", i ); }
}class Program
{static void Main(){Person bill = new Person( "bill", 25 );int age = bill;Console.WriteLine( "Person Info: {0}, {1}", bill.Name, age );Person anon = 35;Console.WriteLine( "Person Info: {0}, {1}", anon.Name, anon.Age );}
}

View Code

  (3)is运算符:

  在转换过程中,有些转换是不成功的,并且会在运行时抛出一个InvalidCastException异常。我们可以使用is运算符来检查转换是否会成功,从而避免盲目地尝试转换

本章思维导图

附件

  思维导图(jpg、pdf以及mmap源文件)下载:http://pan.baidu.com/s/1qWNOGGW

作者:周旭龙

出处:http://www.cnblogs.com/edisonchou/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

转载于:https://www.cnblogs.com/edisonchou/p/3705240.html

《C#图解教程》读书笔记之六:接口和转换相关推荐

  1. C#图解教程读书笔记(第3章 类型、存储及变量)

    1.C#的中的数值不具有bool特性. 2.dynamic在使用动态语言编写的程序集时使用,这个不太明白,看到后面需要补充!! 动态化的静态类型 3.对于引用类型,引用是存放在栈中,而数据是存放在堆里 ...

  2. C#图解教程读书笔记(结构)

    结构是值类型 分别声明一个类和一个结构,实例化后,结构直接保存在堆中. 所以当用一个对象给另一个对象赋值时会有不同: 在赋值后类类型是指向堆里同样的部分,所以cs2和cs1本质上是一样的.而结构类型则 ...

  3. C#图解教程读书笔记(数组)

    数组的类型 交错数组每个子数组的长度可以不同 数组是对象 数组是引用类型,因而数组的内容存储在堆上. 一维数组或矩形数组声明及其实例化 int[] arr2 = new int[4]; MyClass ...

  4. C#图解教程读书笔记(深入理解类)

    类的实例化 类的静态成员 静态成员可以从类的外部访问:D.Mem2,D为类名.而且静态成员即使实例销毁依然存在且可访问. 静态函数成员 不能访问实例成员,但能访问静态成员. 成员常量 成员常量类似与静 ...

  5. 图解HTTP读书笔记(十)

    图解HTTP读书笔记(十) Web的攻击技术 HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用资源才是攻击目标. ...

  6. 《算法图解》读书笔记

    这是一本很入门的算法书,介绍的东西还算简单明了,大体补充了一些自己没理解的东西. 粗略地看了一下,感觉还是"纸上得来终觉浅,绝知此事要躬行!" <<算法图解>&g ...

  7. 《算法图解》读书笔记—像小说一样有趣的算法入门书

    前言 学习算法课程的时候,老师推荐了两本算法和数据结构入门书,一本是<算法图解>.一本是<大话数据结构>,<算法图解>这本书最近读完了,读完的最大感受就是对算法不再 ...

  8. 嵌入式Linux基础教程-读书笔记

    waiting to be fixed. coming soon. +读书笔记: +linux kernel <Linux内核完全剖析基于0.12内核>.pdf 嵌入式Linux基础教程第 ...

  9. 廖雪峰Git教程读书笔记

    因为多人协作导致的不确定因素太多,git需要处理各种各样的情况,除了在多人协作开发过程中用到的常用git命令之外,其它一些不常见的命令的原理和命令都能够在廖老师的教程中给予解答,光通过度娘看解决方法是 ...

最新文章

  1. uwsgi的log日志中出现错误uWSGI listen queue of socket 4 full。
  2. 【Python+selenium Wendriver API】之鼠标悬停事件
  3. 熊猫直播P2P分享率优化(下):ASN组网
  4. python 学习DAY03
  5. ABAP RTTC动态编程在SAP gateway中的应用
  6. 互联网晚报 | 12月6日 星期一 | 荣耀线下门店超3万家;鸿蒙系统明年正式登陆欧洲;凯撒旅业与众信旅游终止合并...
  7. 计算机操作师初级理论知识试卷答案,[计算机操作员初级理论知识试卷1.doc
  8. 关于马尔科夫随机场MRF的思考
  9. Python爬虫错误重试,超时处理
  10. 社区发现 louvain(fast unfolding)算法
  11. 计算机网络(四)—— 网络层(1、2):网络层概述、网络层提供的两种服务
  12. 线性代数【8】-1 线性方程组 - 非常重要的概念 - 三个基本的问题
  13. c语言中的布尔类型头文件,C语言的布尔类型(_Bool)
  14. 播音主持必练的绕口令
  15. 乖离性百万亚瑟王服务器维护,重大更新!《乖离性百万亚瑟王》10月23日维护更新公告...
  16. Linux、UNIX设置开机自动运行命令、脚本配置
  17. 为什么我的windows 10 电脑关机时,电脑灯延迟很久才熄灭?
  18. MAUI 入门教程系列(5.XAML及页面介绍)
  19. GTD任务清单及项目管理器2Do for Mac
  20. 终于解决win7下部分软件乱码的问题

热门文章

  1. 求两条轨迹间的hausdorff距离_自动控制原理 | 根轨迹法
  2. qq飞车登陆服务器无响应,qq飞车手游进不去怎么回事 为什么进不去游戏
  3. 计算机网络接入接口设备,一种计算机网络集成接口设备的制作方法
  4. CALL注入--扫雷辅助(二)
  5. hadoop(6)——mrjob的使用(2)——交给hadoop集群
  6. HDU Problem - 1533 Going Home(费用流板子题)
  7. Kali Firefox
  8. 在Ubuntu 20.04 LTS中配置Java开发环境
  9. 如何检测ARP病毒,arp病毒怎么解决?
  10. 获取版本号_Windows 10 2004迎来KB4577063更新 版本号升至19041.546