惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
有赞技术团队
有赞技术团队
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
The Cloudflare Blog
Microsoft Azure Blog
Microsoft Azure Blog
腾讯CDC
Vercel News
Vercel News
IT之家
IT之家
MyScale Blog
MyScale Blog
博客园_首页
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
罗磊的独立博客

博客园 - 杨连国

win10 IoT开发 Serial​Device 返回 null .NET Delegates: A C# Bedtime Story【转载】 C++ 和 C# 变量定义的一点区别 变量定义 生成器模式(builder) 类型和成员基础(CLR via C#) 基本类型、引用类型、值类型——(CLR via C#) 抽象工厂模式(abstract factory) 李建忠C#面向对象设计模式纵横谈 —— 单件模式 李建忠C#面向对象设计模式纵横谈 —— 面向对象设计模式与原则 程序设计和重构的目标 OO设计原则——读《你必须知道的.NET》 输入法灰掉bug解决 半角全角Bug解决 由迭代模式想到得——用设计模式理解 .NET ASCII 表设计之妙 调用VC封装的DLL时,两个类型匹配问题 调用非托管Dll Invoke 和 BeginInvoke 的区别
接口(CLR via C# 读书笔记)
杨连国 · 2008-07-29 · via 博客园 - 杨连国
 

小点滴:之间考虑程序性能的时候,总是用TickCount来计算自己算法的耗时问题,但是它只能精确到毫秒。看CLR via C# 留意到 StopWatch 这个类,就是专门干这个事的,不错,精度还高,以后就用它了。

接口:

1、 规定:C#支持多接口继承,但不支持多类继承。

2、 C# 接口可以定义方法签名外,还可以定义属性、事件、索引,因为它们背后对应的都是方法。但是C#不支持静态方法(尽管CLR支持,但CLS不支持)。

3、 接口可以相互“继承”,其实这里的继承的味道已经变了,而是有点“联合约定”的味道。

4、 C#编译器要求接口的实现必须声明为public,并且CLR要求该方法应该声明为virtual,如果你没有在源代码上显示标注virtual关键字,编译器会在编译时为其添加virtualsealed关键字,这阻止子类覆写该方法;如果你显示标注了virtual在源码处,编译器是不会再添加sealed关键字的,所以这就允许了子类覆写该方法。

对于sealed接口方法,尽管子类不能覆写,但是子类可以再次继承同一接口,然后实现自己的方法,在具体应用的时候,会调用哪一个就看变量类型了。(但是要注意,应该给子类的同名方法加new 关键字,使其屏蔽父类的方法。)

5、 接口的显示实现:通常情况下,继承接口的类只要实现一个和接口一样方法签名的函数就可以了,编译器会知道两者之间的关联;另外一种情况,通过添加接口类名显示指明实现了哪个接口,这该情况下,不允许对该函数实现获取修饰符(如publicprivate),也不允许使用virtual修饰,编译器会将其编译为privat virtual sealed,也就是说既不能继承,也不能通过类的实例变量调用,只能通过接口变量的方式调用到它。书上还说其,不是一个正常的类方法,通过查看IL代码发现在函数体内多了.override [mscorlib]System.IDisposable::Dispose这么一句话,具体情况还没搞懂。

6、 泛型接口:这里有两点我感觉比较有意思,一是说如果有泛型,就尽量不要用以前的非泛型,因为非泛型为了实现通用性,参数变量往往是object类型,存在安全隐患和拆装箱子的问题。之所以还存在大量的非泛型应用是因为考虑向前兼容。二是继承泛型接口可以因为type的不同,而对同一泛型接口当作两接口。例如:

// this class implements the generic IComparable<T> interface twice

       public sealed class Number : IComparable<Int32>,IComparable<String>

       {

              // 代码省略

}

7、 泛型条件限制:不多说了,这属于泛型的问题,但是可以解决值类型装箱的问题,具体查书。

8、 解决两个接口存在同名函数(方法签名也相同)的问题,可以使用接口显示声明解决。

9、 书上说使用显示接口有很多问题,慎用!看了看确实,如果不是非使用其不解决的问题,就尽量不用。

10、关于设计基类还是设计接口的问题:基本原则是IS-A 还是Can-Do,从书上的意思好像比较倾向于说基类设计好。(具体情况具体分析吧)。