了解多维索引器
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]
成为可能。
我精通 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]
成为可能。