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

本篇已收录至《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)是引用类型->值类型,本质把装箱后的对象转换回值类型。拆箱是显示转换。

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

 

  (3)is运算符:

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

本章思维导图

附件

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

作者:周旭龙

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

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

时间: 2024-10-18 04:53:34

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

SQL Server2012 T-SQL基础教程--读书笔记(5-7章)

SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5.1.2 使用参数 5.1.3 嵌套 5.1.4 多个引用 5.2 公用表表达式 5.2.1 分别列别名 5.2.2 使用参数 5.2.3 定义多个CTE 5.2.4 CTE的多次引用 5.2.5 递归CTE 5.3 视图 5.3.1 视图和ORDER BY 子句 5.3.2 视图选项 5.4 内嵌表

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1.2 INSERT SELECT 语句 8.1.3 INSERT EXEC 语句 8.1.4 SELECT INTO 语句 8.1.5 BULK INSERT 语句 8.1.6 标识列属性和序列对象 8.1.6.1 标识列属性 8.1.6.2 序列对象 8.2 删除数据 8.2.1 DELETE 语

SQL Server2012 T-SQL基础教程--读书笔记

SQL Server2012 T-SQL基础教程--读书笔记 SqlServer Chapter 01 T-SQL 查询和编程背景 1.3 创建表和定义数据的完整性 1.3.1 创建表 1.3.2 定义数据的完整性 1. 主键约束 2. 唯一约束 3. 外键束约 4. CHECK约束 5. 默认约束 Chapter 02 单表查询 2.1 SELECT 语句元素 2.1.7 TOP和OFFSET-FETCH 1. TOP筛选 2. OFFSET-FETCH 2.1.8 开窗函数速览 2.2 谓词

图解HTTP读书笔记(十)

图解HTTP读书笔记(十) Web的攻击技术 HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用资源才是攻击目标. 在客户端即可篡改请求 在Web应用中,从浏览器那接收到的HTTP请求的全部内容,都可以在客户端自由的变更.篡改. 在HTTP请求报文内加载攻击代码,就能发起对Web应用的攻击.通过URL查询字段或表单.HTTP首部,Cookie等途径把攻击代码传入,若这时Web应用存在安全漏洞,那内部信息就会遭到窃

《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构

此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. 首先,所谓网站的伸缩性,指不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力.在整个互联网行业的发展渐进演化中,最重要的技术就是服务器集群,通过不断地向集群中添加服务器来增强整个集群的处理能力. 一.网站架构的伸缩性设计 1.1 不同功能进行物理分离实现伸缩 (1)纵向分离:将业务处理流程上得不同部分分离部署,实现系统的伸缩性: (2)横向分离:将不同的业务模块分离部署

图解算法读书笔记

区别于以往的读书笔记 这次采用了思维导图的模式 PHP js Linux  也相继整理自己的思维导图 便于理解和记忆 主要分为 算法  和数据结构两部分 结合书中python的demo,全部敲了一遍 一 算法 提到算法 绕不过去的肯定是大O表示法  也是各种面试问时间复杂度的重点考察的基础问题 二 数据结构 由堆排序再引出 二叉树 红黑树 等等内容 下次再更新 原文地址:https://www.cnblogs.com/Sherlock09/p/9052912.html

图解HTTP读书笔记16-1-26

图解HTTP1.4.2确保可靠性的HTTP协议    按层次分,TCP位于传输层,提供可靠的字节流服务    所谓字节流服务,指为了方便传输,将大块数据分割成以报文为单位的数据包进行管理,而可靠的传输服务是指,能够把数据准确可靠的传给对方.    即TCP协议为了更加容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方    为了确认无误地将数据送达目标处,TCP协议采用三次握手策略.握手过程使用了TCP的标志位,SYN(synchronize)和ACK(acknowledg

java web轻量级开发面试教程读书笔记:建索引时我们需要权衡的因素

场景一,数据表规模不大,就几千行,即使不建索引,查询语句的返回时间也不长,这时建索引的意义就不大.当然,若就几千行,索引所占的空间也不多,所以这种情况下,顶多属于"性价比"不高. 场景二,某个商品表里有几百万条商品信息,同时每天会在一个时间点,往其中更新大概十万条左右的商品信息,现在用where语句查询特定商品时(比如where name = 'XXX')速度很慢.为了提升查询效率可以建索引,但当每天更新数据时,又会重建索引,这是要耗费时间的. 这时就需要综合考虑,甚至可以在更新前删除

Java web轻量级开发面试教程读书笔记:数据库方面,如何准备面试

如果在面试或与资深人事交流的过程中,你能有效合理地展示出本章所给出的一些知识点,那么对你的评价就会是"对数据库有深入了解",甚至能加上"有设计数据表的经验",即便你说有过3年商业项目数据库操作的经验,那么别人也能相信. 相反,如果一个工作经验满3年的程序员或许动手编程能力不差,但无法在交流沟通过程中证明这点,或者干脆不知道怎么证明,那么对他的评价往往可能是"数据库层面,有过商业项目的经验,但只会些基本的增删改查(顶多再加上会视图存储过程等技术),无法独立担