了解多维索引器

Understanding multidimensional indexer

我精通 OO C# 的基本用法,但有点难过,我不确定以下内容(从大型项目中简化)究竟做了什么以及如何传递参数:

Class test1
{
private prefr iniread;

   private void checkData()
   {
      this.iniread["string1"]["string2"][0][0]
   }
}

public class prefr :
    Component,
    ISupportInitialize,
    ISettingsLoader
{
    #region Events
    public event EventHandler Loading;
    public event EventHandler Loaded;
    public event EventHandler Saving;
    public event EventHandler Saved;
    #endregion

    #region Attributes
    private string _FileName;
    private Dictionary<string, ppPrefSection> _Sections;
    private Control _SaveControl;
    private Control _FinishControl;
    #endregion

    #region Constructors
    public prefr()
    {
        _Sections = new Dictionary<string, prefrSection>();
    }

    public prefr(IContainer container)
        : this()
    {
        container.Add(this);
    }

    public prefr(string Filename)
        : this()
    {
        if (Filename == null) throw new ArgumentNullException("Filename");
        if (!File.Exists(Tools.ReplaceFilenameMacros(Filename))) throw new ArgumentException(String.Format("Filename '{0}' not found.", Filename), "Filename");

        _FileName = Tools.ReplaceFilenameMacros(Filename);
        if (!Load())
            throw new IOException(String.Format("Error reading '{0}'.", _FileName));
    }

    public prefr(string Filename, bool createNew)
        : this()
    {
        //if (Filename == null) throw new ArgumentNullException("Filename");
        //if (!File.Exists(Tools.ReplaceFilenameMacros(Filename))) throw new ArgumentException(String.Format("Filename '{0}' not found.", Filename), "Filename");

        _FileName = Tools.ReplaceFilenameMacros(Filename);
        if (!Load(true))
            throw new IOException(String.Format("Error reading '{0}'.", _FileName));
    }

很明显我在这里遗漏了很多数据,但是根据我提供的内容,任何人都可以阐明 prefr class 如何使用方括号内的数据吗?

我遗漏了 prefr class 中的一些数据,因此可能遗漏了代码的重要部分。我怎样才能使用方括号中传递的信息(基本示例)?

谢谢

你的问题是这怎么可能,对吧?

Class test1
{
    private prefr iniread;

   private void checkData()
   {
      this.iniread["string1"]["string2"][0][0]
   }
}

即如何使用方括号调用 prefr class?

这要归功于 indexers。可能令人困惑的是索引器是在几个步骤中使用的。即不只是 iniread["someName"],还有 initread["string1"]["string2"][0].

但让我们从简单的索引器开始。这是一个简单的例子:

public class MyRegistry
{
    Dictionary<string, string> _items = new Dictionary<string,string>();

    public string this[string name]
    {
        get { return _items[name]; }
    }
}

索引器只是一个特殊的 属性 名称 this 和一个参数。所以通过添加 属性 你可以使用

var value = theRegistry["someName"];

但是,您仍然不能像在您的示例中那样使用 theRegistry[0],因为您会遇到编译错误。要解决这个问题,您只需要添加另一个索引器:

public class MyRegistry
{
    Dictionary<string, string> _items = new Dictionary<string,string>();

    public string this[string name]
    {
        get { return _items[name]; }
    }

    public string this[int index]
    {
        get { return _items.Values[index]; }
    }
}

现在您可以同时使用 theRegistry["someName"]theRegistry[0]

但是他们究竟是如何让 theRegistry["someName"]["anotherName"] 成为可能的呢?

好吧,他们 return 一个也实现了索引器的对象。一个简单的例子是使用相同的对象构建层次结构:

public class MyRegistry
{
    Dictionary<string, MyRegistry> _children = new Dictionary<string,MyRegistry>();

    public MyRegistry this[string name]
    {
        get { return _items[name]; }
    }

    //notice that an object is returned instead
    public MyRegistry this[int index]
    {
        get { return _items.Values[index]; }
    }
}

这使得使用 theRegistry["child1"]["child2"][0] 成为可能。