在C#中隐式和显式实现接口有什么区别?
什么时候应该使用隐式?什么时候应该使用显式?
是否有任何利弊和/或缺点?
Microsoft的官方指南(来自第一版框架设计指南)声明不建议使用显式实现,因为它会给代码带来意外行为.
我认为这个指南在IoC之前的时候是非常有效的,当你没有作为接口传递时.
任何人都可以触及这方面吗?
要回答的事情:
不要担心差异,而有问题的项目则Array不是T[].
多维数组的类似情况是[ 这里 ]
也就是说,N-dims到线性变换总是可行的.所以这个问题引起了我的注意,因为它已经实现IList了线性索引器.
题:
在我的代码中,我有以下声明:
public static Array ToArray<T>(this T source);
Run Code Online (Sandbox Code Playgroud)
我的代码知道如何使souce礼物成为一个数组(在运行时).我正试图让消费代码直接访问其索引器.但如果没有"作为IList",它就不可能完成.
要返回object[]可能需要额外的转换/转换,这就是我要阻止做的事情.
我能做的是:
public static IList ToArray<T>(this T source);
Run Code Online (Sandbox Code Playgroud)
但我认为一个名为ToArrayreturn的方法IList看起来很奇怪.
因此,我对此感到困惑:
在声明中Array,有
object IList.this[int index];
Run Code Online (Sandbox Code Playgroud)
这样我们就可以
Array a;
a=Array.CreateInstance(typeof(char), 1);
(a as IList)[0]='a';
Run Code Online (Sandbox Code Playgroud)
但我们做不到
a[0]='a';
Run Code Online (Sandbox Code Playgroud)
除非它被宣布为
public object this[int index];
Run Code Online (Sandbox Code Playgroud)
我能看到的唯一区别是它需要我们通过IList实现它的接口显式地使用它的索引器,但为什么呢?有好处吗?或者是否存在暴露问题?
举个例子:
public interface IFoo
{
IFoo Bar();
}
public class Foo : IFoo
{
public Foo Bar()
{
//...
}
IFoo IFoo.Bar() { return Bar(); } //Why is this necessary?
}
Run Code Online (Sandbox Code Playgroud)
为什么IFoo Bar()即使Foo转换为IFoo没有强制转换,隐式实现也是必要的?
System.Collections.Concurrent.ConcurrentDictionary的MSDN文档说:
线程安全
所有公共成员和受保护成员
ConcurrentDictionary<TKey,?TValue>都是线程安全的,可以从多个线程同时使用.然而,构件通过接口中的一个访问的ConcurrentDictionary<TKey,?TValue>器具,包括扩展方法,不保证线程安全,并且可能需要由呼叫者进行同步.
(强调我的)
这似乎是自相矛盾的."所有成员都是线程安全的.但成员[有时]不是线程安全的."
我确实理解扩展方法当然不能保证是线程安全的.
但是"通过其中一个接口访问"是什么意思呢?是TryGetValue(IDictionary<TKey, TValue>接口的成员)线程安全吗?
我使用接口来解耦我的代码.我很好奇,是否使用显式接口实现隐藏功能?
例:
public class MyClass : IInterface
{
void IInterface.NoneWillCall(int ragh) { }
}
Run Code Online (Sandbox Code Playgroud)
只有通过界面明确提供此功能有什么好处和具体用例?
我正在攻读MS 70-515考试.在其中一个实践中,作者实现了隐式和显式的接口.显式实现只调用隐式实现.刚才列出了显式实现而没有解释.
同时拥有接口的隐式和显式实现是否有意义?我认为显式实现是多余的(在这种情况下).
public class PassTextBox : TextBox, IScriptControl
{
public virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
var descriptor = new ScriptControlDescriptor(
"AjaxEnabled.PassTextBox", ClientID);
// ...
return new ScriptDescriptor[] {descriptor};
}
IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors()
{
return GetScriptDescriptors();
}
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,代码似乎在没有显式实现的情况下运行得很好,因为隐式实现是公开的.
它涉及MCTS Self-Paced Training Kit(考试70-515):使用Microsoft .NET Framework进行Web应用程序开发4第9章,第2课,练习3.
我正在研究LinkedListC#中的类实现,我无法理解如何隐藏Add方法.
LinkedList实现ICollection,其具有Add方法.在LinkedList类代码中,Add方法声明为:
void ICollection<T>.Add(T value);
Run Code Online (Sandbox Code Playgroud)
如何在界面中声明内部方法?