C# 接口疑问?

忆水思寒 2019-02-17 09:12:27
这个问题是继https://bbs.csdn.net/topics/392516129 上的,虽然结贴了,但欢迎大家补充,毕竟才一个人回答.
然后,自己在查看C#源码时又发现接口的一种实现方法,如下:
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/icollection.cs,a9bf1395d3addc77
基于以前对接口知识的掌握,没看动,搜素一些关键字后发现一条有用的讲解:https://blog.csdn.net/huyu107/article/details/51144849
原来使用了是使用了一种契约式编程规则,并借助讲解链接中的第七条,大概看懂了
这时问题就来了,源代码中使用了 "#if CONTRACTS_FULL"但没看到 CONTRACTS_FULL 的定义,这时按照条件编译规则是不编译的,如果不编译会出现很多问题,如ICollection<T>继承了IEnumerable<T>而没有实现其中的方法; 但如果CONTRACTS_FULL 有定义,则一切都正常了,请问CONTRACTS_FULL 是否有定义,如果有在哪里,如果没有那出现的问题怎么解决?

...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
圣殿骑士18 2019-02-18
  • 打赏
  • 举报
回复
引用 4 楼 忆水思寒 的回复:
还有,大哥问什么现在提问,很少有人回答,比如上个问题就你一人回答了,是分太少了吗?还有还不能给别人发私信,如果有人回答后自己又有一问,先让回答人看到,除非他主动来看,不然根本没法通知他,这点我感觉很不好,大哥知道怎么解决吗
引用
圣殿骑士18


分是有点少。肯定有人在意的。私信我从来不看的。只能等了,能不能被回答,看几点:
1、运气
2、提问要详细到位,让回答的人省力
3、分数
  • 打赏
  • 举报
回复
引用 4 楼 忆水思寒 的回复:
还有,大哥问什么现在提问,很少有人回答,比如上个问题就你一人回答了,是分太少了吗?还有还不能给别人发私信,如果有人回答后自己又有一问,先让回答人看到,除非他主动来看,不然根本没法通知他,这点我感觉很不好,大哥知道怎么解决吗
引用
圣殿骑士18
你这个问题20确实少了,而且你期待的发出问题马上就有人解答也不太可能
忆水思寒 2019-02-18
  • 打赏
  • 举报
回复
还有,大哥问什么现在提问,很少有人回答,比如上个问题就你一人回答了,是分太少了吗?还有还不能给别人发私信,如果有人回答后自己又有一问,先让回答人看到,除非他主动来看,不然根本没法通知他,这点我感觉很不好,大哥知道怎么解决吗
引用
圣殿骑士18
忆水思寒 2019-02-18
  • 打赏
  • 举报
回复
大哥说的对,我没仔细看,还感觉是上次提问的class继承接口后现实接口那种类型,如果是接口继承接口,就没疑惑了,不过你指点的 CONTRACTS_FULL 的结束是很有帮助的
忆水思寒 2019-02-18
  • 打赏
  • 举报
回复
引用 6 楼 圣殿骑士18 的回复:
[quote=引用 4 楼 忆水思寒 的回复:] 还有,大哥问什么现在提问,很少有人回答,比如上个问题就你一人回答了,是分太少了吗?还有还不能给别人发私信,如果有人回答后自己又有一问,先让回答人看到,除非他主动来看,不然根本没法通知他,这点我感觉很不好,大哥知道怎么解决吗
引用
圣殿骑士18
分是有点少。肯定有人在意的。私信我从来不看的。只能等了,能不能被回答,看几点: 1、运气 2、提问要详细到位,让回答的人省力 3、分数[/quote] 1. 运气 --不能操作,不过能遇见 像 圣殿骑士18 这样的版主感觉也挺好的 2. 详细到位, 能做到,每次提问前自己都是尽可能先查找网上相关问题还没得到答案才提问的,我会写的很详细的 3.分数 虽然看了论坛中相关版主总结的怎么挣积分,但感觉麻烦,那就用金钱买积分,以后分数绝对不会少了.
圣殿骑士18 2019-02-17
  • 打赏
  • 举报
回复
CONTRACTS_FULL 有没有用呢?

有用。但条件编译本来写或不写,都不应该出错的。否则怎么叫条件编译,那不成 “条件不编译” 了吗?

CONTRACTS_FULL 的用途和我们使用者无关,这是.net类库编写者,他自己测试这个接口定义使用的。你可以理解为它使用契约编程,为这个接口写的单元测试的一部分。只有在DEBUG模式下才会有用。

可以看下ContractClassAttribute的定义:
    //
// 摘要:
// 指定一个单独的类型包含此类型的代码协定。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
[Conditional("CONTRACTS_FULL")]
[Conditional("DEBUG")]
public sealed class ContractClassAttribute : Attribute
{


注意,其中的
[Conditional("CONTRACTS_FULL")]
[Conditional("DEBUG")]
说明ContractClass也仅在DEBUG下才能生效。

==========
欢迎关注微信公众号 “产品技术知与行” ,打造全面的结构化知识库,包括原创文章、免费课程(C#,Java,Js)、技术专题、视野知识、源码下载等内容。
圣殿骑士18 2019-02-17
  • 打赏
  • 举报
回复
你的观点错了。


按照条件编译规则是不编译的,如果不编译会出现很多问题,如ICollection<T>继承了IEnumerable<T>而没有实现其中的方法;
--
没有指定编译条件CONTRACTS_FULL ,并不会出现问题。接口A继承接口B,并不是说接口A要实现接口B。你观念混淆了。它是接口哎,怎么能“实现”呢?只有“class”才能实现“interface”。接口A继承接口B,只表示A包含B,和实现无关。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧