Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#接口。隐式实现与显式实现?

C#接口。隐式实现与显式实现?

提问于 2017-12-15 02:42:11
回答 2关注 0查看 423
  • 在C#中隐式和显式实现接口有什么区别?
  • 什么时候应该使用隐式,何时应该使用explicit?
  • 这两者是否有优点和/或缺点?

微软的官方指南(从第一版的框架设计指南)指出,不建议使用显式实现,因为它给代码带来了意想不到的行为。

我认为这个准则在IoC之前是非常有效的,当你不把它作为接口传递的时候。

有没有人碰到这方面的问题?

回答 2

MyLove

发布于 2017-12-15 04:59:36

隐式定义只是将接口要求的方法/属性等直接作为公共方法添加到类中。

显式定义强制成员仅在直接使用接口而不使用底层实现时才被公开。这在大多数情况下是首选。

  1. 通过直接使用接口,您不能确认,并将您的代码耦合到底层的实现。
  2. 如果在代码中已经有一个公共属性名称,并且要实现一个也具有一个Name属性的接口,那么明确地执行它将使两者保持独立。即使他们正在做同样的事情,我仍然将明确的调用委托给Name属性。你永远不知道,你可能想要改变Name对普通类的作用,以及Name,接口属性如何工作。
  3. 如果你隐式地实现一个接口,那么你的类现在就暴露了新的行为,这些行为可能只是和接口的客户端相关,这意味着你不能保证你的类简洁(我的意见)。

akjok54

发布于 2017-12-15 04:59:14

隐含的是当你通过你的类的成员定义你的接口。显式是在接口上的类中定义方法的时候。我的意思:IList.CopyTo将隐含实施为:

代码语言:txt
AI代码解释
复制
public void CopyTo(Array array, int index)
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
    throw new NotImplementedException();
代码语言:txt
AI代码解释
复制
}

并明确表示为:

代码语言:txt
复制
代码语言:txt
AI代码解释
复制
void ICollection.CopyTo(Array array, int index)
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
    throw new NotImplementedException();
代码语言:txt
AI代码解释
复制
}

不同之处在于隐式地通过你所创建的类来访问它,当它被转换为该类时,以及当它被转换为接口时。显式实现允许它只能在作为接口本身进行转换时才可访问。

代码语言:txt
AI代码解释
复制
MyClass myClass = new MyClass(); // Declared as concrete class
代码语言:txt
AI代码解释
复制
myclass.CopyTo //invalid with explicit
代码语言:txt
AI代码解释
复制
((IList)myClass).CopyTo //valid with explicit.

主要使用显式来保持实现干净,或者当需要两个实现时。但,一般很少使用它。

和开发者交流更多问题细节吧,去 写回答
相关文章
温故知新:接口的隐式实现与显式实现
这二者的区别,仅在一个类同时实现多个接口,且多个接口中有相同的方法名字定义时,才有比较的意义。 using System; namespace InterfaceTest { class Program { static void Main(string[] args) { TestAB ab = new TestAB(); ab.HelloWorld(); //Hello World!
菩提树下的杨过
2018/01/23
7870
显式原型与隐式原型
* 函数的prototype属性: 在定义函数时自动添加的, 默认值是一个空Object对象
李才哥
2020/03/28
5430
显式原型与隐式原型
C#-接口与显式接口实现
继承IEquatable的类必须实现Equals的方法,IEquatable<T>不提供Equals的实现。 接口可以包含方法、属性、事件、索引器。 接口不能包含常量、字段、运算符、实例构造函数、终结器或类型。接口成员会自动称为公有成员,不能包含任何访问符。成员也不能是静态成员。
祝你万事顺利
2019/08/23
7240
MySQL显式事务与隐式事务
显式事务是指在应用程序中明确指定事务的开始和结束,使用BEGIN、COMMIT和ROLLBACK语句来控制事务的执行。
堕落飞鸟
2023/05/11
1.4K0
JavaScript显式原型与隐式原型
在JavaScript中,每个函数都有一个特殊的属性称为"prototype"。这个"prototype"属性是一个对象,它定义了该函数创建的对象的共享属性和方法。
堕落飞鸟
2023/05/17
4000
上手隐式锁,显式锁
对于聚簇索引记录来说,有一个 trx_id 隐藏列,该隐藏列记录着最后改动该记录的 事务id 。那么如果在当前事务中新插入一条聚簇索引记录后,该记录的 trx_id 隐藏列代表的的就是 当前事务的 事务id ,如果其他事务此时想对该记录添加 S锁 或者 X锁 时,首先会看一下该记录的trx_id 隐藏列代表的事务是否是当前的活跃事务,如果是的话,那么就帮助当前事务创建一个 X锁 (也就是为当前事务创建一个锁结构, is_waiting 属性是 false ),然后自己进入等待状态 (也就是为自己也创建一个锁结构, is_waiting 属性是 true )。
一个风轻云淡
2022/11/15
5890
上手隐式锁,显式锁
C# 隐式转换_php隐式转换
预定义的隐式转换总会成功而且不会引发异常,适当合理的用户自定义隐式转换也可以展示出这些 特性。
全栈程序员站长
2022/09/27
1.7K0
oracle隐式转换和显式转换_oracle显示游标和隐式
和其他的关系型数据库一样, oracle 中也能进行一些隐式的数据转换,这对我们写 SQL 语句有 非常 用,我们可以不必麻烦地手动转化很多类型的字符。虽然前面我们介绍了一些使用例如to_char,to_date的函数进行强制转换的方法,但是隐式转换也还是不错的。 Orac
全栈程序员站长
2022/11/10
1.3K0
C# 数据类型转换 显式转型、隐式转型、强制转型
显式转型:有可能引发异常、精确度丢失及其他问题的转换方式。需要使用手段进行转换操作。
痴者工良
2021/04/26
1.3K0
Selenium等待:sleep、隐式、显式和Fluent
Selenium等待页面加载在Selenium自动化测试中起着重要的作用。它们有助于使测试用例更加稳定,增强健壮性。Selenium提供多种等待,根据某些条件在脚本执行相应的等待,从而确保Selenium执行自动化测试时不会导致脚本失败。
FunTester
2020/09/27
3.1K0
如何实现隐式类型转换
Result 类型是许多编程语言中处理错误的常用方式,包括 C# 的 dotNext 库。在本文中,我们将通过例子回顾 C# 中 using 语句和隐式类型转换的使用。
newbe36524
2023/08/23
3340
android学习笔记----隐式意图和显式意图
显式意图:显式意图明确指明了启动活动的上下文和想要启动的目标活动,显式意图明确指定了Intent应该传递给哪个组件。 隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
砖业洋__
2023/05/06
1.8K0
android学习笔记----隐式意图和显式意图
C#中的类型转换-自定义隐式转换和显式转换
有时我们会遇到这么一种情况:在json数据里,数组里的数据类型不一致,导致我们不能直接反序列化为目标类型。最终我们只能反序列化为JObject类型,然后通过字符串取值的方式来取出数据。
过千帆
2022/04/23
2.8K0
技术分享 | Web自动化之显式等待与隐式等待
等待就是当运行代码时,如果页面的渲染速度跟不上代码的运行速度,就需要人为的去限制代码执行的速度。
霍格沃兹测试开发
2022/04/27
1.1K0
Android开发学习——显式intent和隐式intent(1)
区别 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。 隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。
Max超
2019/01/21
7810
​技术分享 | Web自动化之显式等待与隐式等待
等待就是当运行代码时,如果页面的渲染速度跟不上代码的运行速度,就需要人为的去限制代码执行的速度。
Hogwarts_测试
2022/04/27
1K0
Scala 【 14 隐式转换与隐式参数 】
​ Scala 的隐式转换,其实最核心的就是定义隐式转换函数,即 implicit conversion function 。
Lokinli
2023/03/09
1K0
[android] 隐式意图和显式意图的使用场景
看到Display.com.android.mms/.ui.ComposeMessageActivity
唯一Chat
2019/09/10
1.3K0
MySQL隐式类型注入与隐式转换
在MySQL中执行SQL查询时,如果SQL语句中字段的数据类型和表中对应字段的数据类型不一致时,MySQL查询优化器会将数据的类型进行隐式转换。
Petrochor
2022/06/07
1.5K0
MySQL隐式类型注入与隐式转换
Java并发之显式锁和隐式锁比较
在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchronized(下文简称:sync)和lock(下文就用ReentrantLock来代之lock)的区别。
凯哥Java
2020/04/16
1.1K0
Java并发之显式锁和隐式锁比较

相似问题

如何避免Python中的显式“self”?

2213

C#匿名类可以实现一个接口吗?

22.3K

柔性作业车间调度工序插入式解码如何实现以及原理?

0126

函数式,声明式和命令式编程?

22.7K

HostnameVerifier接口的不安全实现?

0553
相关问答用户
公司公司公司公司公司公司 | 职务职务职务职务职务职务擅长3个领域
中建数科 | 技术总监架构部总经理擅长3个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档