C#接口,你真的掌握了么

一、定义接口

接口对一组方法签名进行了统一命名。定义接口类型时,可指定的可见性为public 或 internal,但在[CLR via C#]第3版书中的原话是:"定义接口类型时,可指定你希望的任何可见性/可访问性(public,protected,internal等)",个人认为这句话说得不妥。但无论如何,不嵌套在其他类型中的顶级类型的可访问性只能是 internal 或 public。这些类型的默认可访问性是 internal。

二、继承接口

C#编译器要求将用于实现一个接口的方法简称接口方法标记为public。CLR要求将接口方法标记为virtual。如果在源代码中没有显式地将接口方法标记为virtual,编译器会将它们标记为virtual和sealed;这会阻止派生类重写接口方法。如果显式地将接口方法标记为virtual,编译器就会将此方法标记为virtual并保持它的非密封状态,这样一来,派生类就可以重写它。

值类型可以实现零个或多个接口。不过,将值类型的实例转型为接口类型时,值类型的实例必须装箱。这是由于接口变量是一个引用,它必须指向堆上的一个对象,使CLR能检查对象的类型对象指针,从而判断对象的确切类型。然后,在调用已装箱值类型的一个接口方法时,CLR会跟随对象的类型对象指针,找到类型对象的方法表,从而调用正确的方法。

三、隐式和显式接口方法实现

    public class SimpleType : IDisposable

{

//隐式接口方法实现

public void Dispose(){ Console.WriteLine("public Dispose");}

//显式接口方法实现(不允许指定可访问性,但是编译器生成方法的元数据时,其可访问性会被自动设为private)

void IDisposable.Dispose(){Console.WriteLine("IDisposable Dispose")}

}

public static void Main()

{

SimpleType st = new SimpleType();

st.Dispose();//输出结果为"public Dispose"

IDisposable d = st;

d.Dispose();//输出结果为"IDisposable Dispose"

}

四、泛型接口

泛型接口提供的好处:

private void Method1()

{

Int32 x = 1, y = 2;

IComparable c = x;

c.CompareTo(y);//CompareTo期望接收一个Object类型的参数,传递y没有问题,但是值类型会装箱

c.CompareTo("2")//可以编译通过,但是在运行时会抛出异常,无法提供编译时类型安全性

}

private void Method2()

{

Int32 x = 1, y = 2;

IComparable<Int32> c = x;

c.CompareTo(y);//CompareTo期望接收一个Int21类型的参数,传递y没有问题,而且y不会装箱

c.CompareTo("2")//编译错误,可以提供编译时的类型检查

}

1.泛型接口提供了出色的编译时类型安全性。

2.处理值类型时,装箱次数会少得多。

3.类可以实现同一个接口若干次,只要每次使用不同的类型参数

五、在不存在泛型接口版本的情况下,怎样实现来增强编译时的类型安全性

public struct SomeValueType1 : IComparable

{

private Int32 _x;

public SomeValueType(Int32 x){  _x = x; }

public Int32 CompareTo(Object other)

{

return (_x - ((SomeValueType)other)._x);

}

}

public struct SomeValueType2 : IComparable

{

private Int32 _x;

public SomeValueType(Int32 x){  _x = x; }

public Int32 CompareTo(SomeValueType2 other)

{

return (_x - other._x);

}

Int32 IComparable.CompareTo(Object o)

{

return CompareTo((SomeValueTypes)o);

}

}

public static void Main()

{

SomeValueType1 v1 = new SomeValueType1(0);

Object o = new Object();

v1.CompareTo(v1); //值类型进行装箱操作

v1.CompareTo(o) //编译通过,但运行时抛出InvalidCastException,没法进行编译时类型安全的检查

SomeValueType2 v2 = new SomeValueType2(0);

Object o = new Object();

v2.CompareTo(v2); //由于调用的是SomeValueType2自身声明的方法,所以不用装箱

v1.CompareTo(o) //无法通过编译,能提供编译时的类型安全检查

}

C#接口,你真的掌握了么,布布扣,bubuko.com

时间: 2024-10-10 08:26:44

C#接口,你真的掌握了么的相关文章

[转]简单识别 RESTful 接口

     本文描述了识别一个接口是否真的是 RESTful 接口的基本方法.符合 REST 架构风格的接口,称为 RESTful 接口.本文不打算从架构风格的推导方面描述,而是从 HTTP 标准的方面描述.识别的方法同时也是指导实践的原则.       一.是否使用了正确(合适)的方法 目前对于 HTTP 标准滥用较多的,就是方法.谈起 RESTful 接口的方法,很多资料告诉大家,说 GET.POST.PUT.DELETE,分别对应数据库操作的 SELECT.INSERT.UPDATE.DEL

简单识别 RESTful 接口

本文描述了识别一个接口是否真的是 RESTful 接口的基本方法.符合 REST 架构风格的接口,称为 RESTful 接口.本文不打算从架构风格的推导方面描述,而是从 HTTP 标准的方面描述.识别的方法同时也是指导实践的原则. 一.是否使用了正确(合适)的方法 目前对于 HTTP 标准滥用较多的,就是方法.谈起 RESTful 接口的方法,很多资料告诉大家,说 GET.POST.PUT.DELETE,分别对应数据库操作的 SELECT.INSERT.UPDATE.DELETE.其实这种理解是

C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取

一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号密码.作为微信接口开发人员我们知道网页授权可以用作微信网页用作安全登录,带参数二维码的使用用作记录用户来源,模板消息用作购物消费等消息的通知,但是很少看到有综合利用这些高级接口做出体验比较好的公众账号,这里分享一些我开发的用户绑定和验证码的一些心得.所需要的接口有基础的回复.网页授权.带参数二维码.

【MML】华为MML AAA接口联调,Java版本

1.我们先设置一些常量数据 package cn.cutter.ztesoft.HuWeiMML.constrant; /** * @description: AAA接口常量设置 * @author: xiaof * @create: 2018-07-26 10:07 **/ public class InfAAAMissionConstrant { /** *订单号,工单号,宽带账号 */ public static final String AAA_ORDER_ID = "orderId&q

servlet线程安全问题

由于默认情况下Servlet,在内存中只有一个实例对象,当多个浏览器并发访问Servlet时就有可能产生线程安全问题 解决方案: 1.加锁--效率降低 synchronized(this){  } 2.SingleThreadModel接口 -- 不能真的防止线程安全问题 在服务器的内部维护一个对象池,放servlet的对象,一个请求过来,会到池里检查一下有没有这个servlet,如果没有,创建一个给当前线程使用,使用完的就放回池里.如果第一个线程使用的servlet对象还没有还回池里,第二线程

20160314 Servlet 入门

一.Servlet 1.sun提供的一种动态web资源开发技术.本质上就是一段java小程序.可以将Servlet加入到Servlet容器中运行. *Servlet容器 -- 能够运行Servlet的环境就叫做Servlet容器. --- tomcat *web容器 -- 能够运行web应用的环境就叫做web容器 --- tomcat 2. 写一个类实现sun公司定义的Servlet接口 将写好的类配置到tomcat中的web应用的web.xml中,(配置对外访问路径) 3.Servlet的调用

MVC WebApi 用户验证 (2)

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2) 前言: 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(65)-MVC WebApi 用户验证 (1) 回顾上一节,我们利用webapi简单的登录并进行了同域访问与跨域访问来获得Token,您可以跳转到上一节下载代码来一起动手. 继续上一篇的文章,我们接下来演示利用拿到的Token来访问接口,管理接

性能测试从0到1的过程(二)

本人,从毕业开始接触测试,但是性能方面一无所知.之前在第一份工作,测过安卓客户端,当时写过一个非常简单的shell脚本,push到手机系统内,用于手机硬件信息.但是在服务端的性能方面,真的是一只菜鸟.现在 本鸟把自己最近一个月的性能测试经验分享一下吧. 一.环境准备,这个熟门熟路.之前的帖子已经写了,装zk/kafka这些中间件需要,再是部署应用服务.重点是部署的过程中,首先你要准备好profile要与测试.生产环境都隔离,再者,用于性能测试的环境,最好是模拟线上去配置,机器最好是申请高级一点,

Java中动态代理实现原理深究

一.前言 笔者平时开发使用"动态代理"不多,最近在看设计模式的时候,"动态代理"又在面前晃了几次,所以这次想从源码的角度去分析动态代理的实现原理,以窥探其精妙~ 二.正文 2.1 静态代理  本文源码基于:jdk1.6.0_33 在正式剖析动态代理的源码之前,我们可以先来看看"静态代理"(就是我们普通的代理模式)的UML图: 从上图可以看出,代理类"ProxySubject"和被代理类"RealSubject&quo