.NET接口如何包含数据

时间:2018-10-25 13:30:05

标签: c# vb.net

根据我的理解界面,这些只是协议,没有任何实现。

我正在尝试理解以下代码:

此代码有效

  Exception ex = new Exception();
  ex.Data.Add("1", "One");

因为DataListDictioaryInternal类型的属性(如智力所示),它实现了IDictionary

但是,如果右键单击Data并转到定义,则会看到该定义为:

public virtual IDictionary Data { get; }

为什么Data没有定义为ListDictioaryInternal

2 个答案:

答案 0 :(得分:4)

Exception类定义属性Data,其类型为IDictionary。这意味着实现该接口的任何对象都可以由getter返回。实际上,如果深入研究定义,您将在注释中看到这一点:

// Summary:
//     Gets a collection of key/value pairs that provide additional user-defined information
//     about the exception.
//
// Returns:
//     An object that implements the System.Collections.IDictionary interface and contains
//     a collection of user-defined key/value pairs. The default is an empty collection.
public virtual IDictionary Data { get; }

该类的内部实现似乎使用System.Collections.ListDictionaryInternal作为实际使用的对象。如果您查看该类的源代码,则会发现它实现了相关的接口:

internal class ListDictionaryInternal: IDictionary 
{
    //...
}

因此,接口表示对象可以做什么的契约。返回的实际对象是实现该接口的具体类。

答案 1 :(得分:3)

由于ListDictionaryInternal实现了IDictionary,因此IDictionary的使用符合abstraction