相关疑难解决方法(0)

C#接口.隐式实现与显式实现

在C#中隐式显式实现接口有什么区别?

什么时候应该使用隐式?什么时候应该使用显式?

是否有任何利弊和/或缺点?


Microsoft的官方指南(来自第一版框架设计指南)声明不建议使用显式实现,因为它会给代码带来意外行为.

我认为这个指南在IoC之前的时候是非常有效的,当你没有作为接口传递时.

任何人都可以触及这方面吗?

.net c# interface

615
推荐指数
10
解决办法
14万
查看次数

为什么Array类没有直接暴露其索引器?

要回答的事情:

  1. 不要担心差异,而有问题的项目则Array不是T[].

  2. 多维数组的类似情况是[ 这里 ]

也就是说,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实现它的接口显式地使用它的索引器,但为什么呢?有好处吗?或者是否存在暴露问题?

c# arrays ilist indexer

22
推荐指数
2
解决办法
3509
查看次数

在C#中,为什么接口实现必须明确地实现另一个方法版本?

举个例子:

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没有强制转换,隐式实现也是必要的?

.net c# interface explicit-implementation

12
推荐指数
3
解决办法
324
查看次数

.NET的ConcurrentDictionary的哪些成员是线程安全的?

System.Collections.Concurrent.ConcurrentDictionary的MSDN文档说:

线程安全

所有公共成员和受保护成员ConcurrentDictionary<TKey,?TValue>都是线程安全的,可以从多个线程同时使用.然而,构件通过接口中的一个访问的ConcurrentDictionary<TKey,?TValue>器具,包括扩展方法,不保证线程安全,并且可能需要由呼叫者进行同步.

(强调我的)

这似乎是自相矛盾的."所有成员都是线程安全的.但成员[有时]不是线程安全的."

我确实理解扩展方法当然不能保证是线程安全的.

但是"通过其中一个接口访问"是什么意思呢?是TryGetValue(IDictionary<TKey, TValue>接口的成员)线程安全吗?

.net c# concurrency multithreading concurrentdictionary

10
推荐指数
1
解决办法
1108
查看次数

是否使用显式接口实现隐藏功能?

我使用接口来解耦我的代码.我很好奇,是否使用显式接口实现隐藏功能?

例:

public class MyClass : IInterface
{
     void IInterface.NoneWillCall(int ragh) { }
}
Run Code Online (Sandbox Code Playgroud)

只有通过界面明确提供此功能有什么好处和具体用例?

c# interface

7
推荐指数
1
解决办法
863
查看次数

实现接口隐式和显式是否有意义?

我正在攻读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.

c# explicit interface implicit

7
推荐指数
1
解决办法
324
查看次数

隐式<>显式接口

可能的重复:
C#:接口 - 隐式和显式实现
隐式与显式接口实现

你好

谁能解释一下隐式和显式接口之间的区别是什么?

谢谢!

.net c# explicit interface implicit

6
推荐指数
2
解决办法
947
查看次数

隐藏在C#类中的方法

我正在研究LinkedListC#中的类实现,我无法理解如何隐藏Add方法.

LinkedList实现ICollection,其具有Add方法.在LinkedList类代码中,Add方法声明为:

void ICollection<T>.Add(T value);
Run Code Online (Sandbox Code Playgroud)

如何在界面中声明内部方法?

c#

3
推荐指数
1
解决办法
153
查看次数