首页 > 技术文章 > 关于C#的接口的碎碎念

fastcam 2021-07-08 18:03 原文

首先明确两件事情,1.C#的接口是引用类型的。2.值类型转引用类型时会发生装箱。

这样在我们设计一个容器类的时候大概率会遇到这种事:

我们希望继承某个接口用以表明身份,比如IEnumerable 或 IEnumerable<>这样我们需要一个GetEnumerator方法,然而我们又发现该接口的迭代器返回类型为IEnumerator<>,这时,如果我们老老实实的实现一个返回IEnumerator<>的GetEnumerator时会发现我们应该new了一个class,敏感的你肯定会感觉到此时会产生GC。尽管这个GC的量不会太大,副反应也不会真的严重到影响你程序的运行,但是,你知道确实有不产生GC的写法。让GetEnumerator返回一个Struct。你知道只要这个Struct继承一个IEnumerator就可以让foreach正常跑起来,也没有GC,假如你写的对,运行时一切完美。但是我们的代码?已经有很多看起来坑坑洼洼的地方了。就像下面那样。

 IEnumerator IEnumerable.GetEnumerator(){throw new NotImplementedException();

这个时候我就会纳闷,我当初费劲巴拉继承IEnumerable这种接口要干嘛啊?

所以说,面向接口编程有时还真是挺蛋疼的。

推荐阅读