

下面是类图:
这个类继承了三个接口,分述如下:
1. IClonable接口
msdn对这个接口的描述如下:
----------------------------------------------------------------------------------
概述:
支持克隆,即用与现有实例相同的值创建类的新实例。
ICloneable 接口包含一个成员 Clone,它用于支持除 MemberwiseClone 所提供的克隆之外的克隆。
支持克隆,即用与现有实例相同的值创建类的新实例。
ICloneable 接口包含一个成员 Clone,它用于支持除 MemberwiseClone 所提供的克隆之外的克隆。
另外,Clone与Copy方法的区别是:
Copy() 是复制新副本,包括结构和数据。
Clone() 是复制结构,不包括数据。
2. ICollection接口
msdn的描述如下:
概述:
定义所有集合的大小、枚举数和同步方法。
备注:
ICollection 接口是 System.Collections 命名空间中类的基接口。IDictionary 和 IList 是基于 ICollection 接口的更专用的接口。IDictionary 实现是键/值对的集合,如 Hashtable 类。IList 实现是可被排序且可按照索引访问其成员的值的集合,如 ArrayList 类。
某些集合(如 Queue 类和 Stack 类)限制对其成员的访问,它们直接实现 ICollection 接口。
如果 IDictionary 接口和 IList 接口都不能满足所需集合的要求,则从 ICollection 接口派生新集合类以提高灵活性。
定义所有集合的大小、枚举数和同步方法。
备注:
ICollection 接口是 System.Collections 命名空间中类的基接口。IDictionary 和 IList 是基于 ICollection 接口的更专用的接口。IDictionary 实现是键/值对的集合,如 Hashtable 类。IList 实现是可被排序且可按照索引访问其成员的值的集合,如 ArrayList 类。
某些集合(如 Queue 类和 Stack 类)限制对其成员的访问,它们直接实现 ICollection 接口。
如果 IDictionary 接口和 IList 接口都不能满足所需集合的要求,则从 ICollection 接口派生新集合类以提高灵活性。
3. IEnumerable接口
msdn的描述如下:
概述:公开枚举数,该枚举数支持在集合上进行简单迭代。
备注:对实施者的说明:
必须实现 IEnumerable 以支持 Microsoft Visual Basic 的 ForEach 语义。允许枚举数的 COM 类也实现此接口。
备注:对实施者的说明:
必须实现 IEnumerable 以支持 Microsoft Visual Basic 的 ForEach 语义。允许枚举数的 COM 类也实现此接口。
以下是该类各个成员的分析:
1. 私有成员_Hashtable
private Hashtable _Hashtable;
这个私有成员是该类的基础,添加到该类中的数据都添加到这个Hashtable中,Add, Remove等方法也是间接的对这个Hashtable进行操作
2. 构造函数
public SettingsPropertyCollection()
{
this._Hashtable = null;
this._ReadOnly = false;
this._Hashtable = new Hashtable(10, CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
}
{
this._Hashtable = null;
this._ReadOnly = false;
this._Hashtable = new Hashtable(10, CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
}
private SettingsPropertyCollection(Hashtable h)
{
this._Hashtable = null;
this._ReadOnly = false;
this._Hashtable = (Hashtable) h.Clone();
}
{
this._Hashtable = null;
this._ReadOnly = false;
this._Hashtable = (Hashtable) h.Clone();
}
在构造函数中用到一个初始化HashTable的方法,msdn中关于该初始化方法的描述如下:
[C#]
public Hashtable(
int capacity,
IHashCodeProvider hcp,
IComparer comparer
);
参数
capacity
Hashtable 最初可包含的近似元素个数。
hcp
IHashCodeProvider,可为 Hashtable 中的所有键提供哈希代码。
- 或 -
空引用(Visual Basic 中为 Nothing),使用默认哈希代码提供程序,该提供程序是每一个键的 Object.GetHashCode 实现。
comparer
IComparer,用于确定两个键是否相等。
- 或 -
空引用(Visual Basic 中为 Nothing),使用默认比较器,该比较器是每一个键的 Object.Equals 实现。
public Hashtable(
int capacity,
IHashCodeProvider hcp,
IComparer comparer
);
参数
capacity
Hashtable 最初可包含的近似元素个数。
hcp
IHashCodeProvider,可为 Hashtable 中的所有键提供哈希代码。
- 或 -
空引用(Visual Basic 中为 Nothing),使用默认哈希代码提供程序,该提供程序是每一个键的 Object.GetHashCode 实现。
comparer
IComparer,用于确定两个键是否相等。
- 或 -
空引用(Visual Basic 中为 Nothing),使用默认比较器,该比较器是每一个键的 Object.Equals 实现。
备注
如果指定初始容量,则无需在向 Hashtable 中添加元素时执行大量的大小调整操作。容量会根据需要基于加载因子自动增加。
加载因子是元素与存储桶的最大比率。较小的加载因子意味着以消耗更大内存为代价的更快查找。默认加载因子为 1.0,这是速度和大小之间的最佳平衡。
当实际加载因子达到此加载因子时,存储桶的数目自动增加到比当前存储桶数大两倍的最小质数。
哈希代码提供程序为 Hashtable 中的键分配哈希代码。默认哈希代码提供程序是键的 Object.GetHashCode 实现。
比较器确定两个键是否相等。Hashtable 中的每个键必须是唯一的。默认比较器是键的 Object.Equals 实现。
自定义哈希代码提供程序和自定义比较器可启用如下方案:用不区分大小写的字符串进行查找
如果指定初始容量,则无需在向 Hashtable 中添加元素时执行大量的大小调整操作。容量会根据需要基于加载因子自动增加。
加载因子是元素与存储桶的最大比率。较小的加载因子意味着以消耗更大内存为代价的更快查找。默认加载因子为 1.0,这是速度和大小之间的最佳平衡。
当实际加载因子达到此加载因子时,存储桶的数目自动增加到比当前存储桶数大两倍的最小质数。
哈希代码提供程序为 Hashtable 中的键分配哈希代码。默认哈希代码提供程序是键的 Object.GetHashCode 实现。
比较器确定两个键是否相等。Hashtable 中的每个键必须是唯一的。默认比较器是键的 Object.Equals 实现。
自定义哈希代码提供程序和自定义比较器可启用如下方案:用不区分大小写的字符串进行查找
存储桶的数目自动增加到比当前存储桶数大两倍的最小质数。为什么?
3. Add方法
public void Add(SettingsProperty property)
{
if (this._ReadOnly)
{
throw new NotSupportedException();
}
this.OnAdd(property);
this._Hashtable.Add(property.Name, property);
this.OnAddComplete(property);
}
{
if (this._ReadOnly)
{
throw new NotSupportedException();
}
this.OnAdd(property);
this._Hashtable.Add(property.Name, property);
this.OnAddComplete(property);
}
如果只读,就抛出错误。
否则,先执行OnAdd方法,进行添加前的处理,然后添加到HashTable中,然后执行OnAddComplete方法,进行添加后的处理
4. Clear方法
public void Clear()
{
if (this._ReadOnly)
{
throw new NotSupportedException();
}
this.OnClear();
this._Hashtable.Clear();
this.OnClearComplete();
}
{
if (this._ReadOnly)
{
throw new NotSupportedException();
}
this.OnClear();
this._Hashtable.Clear();
this.OnClearComplete();
}
5. Remove方法
public void Remove(string name)
{
if (this._ReadOnly)
{
throw new NotSupportedException();
}
SettingsProperty property1 = (SettingsProperty) this._Hashtable[name];
if (property1 != null)
{
this.OnRemove(property1);
this._Hashtable.Remove(name);
this.OnRemoveComplete(property1);
}
{
if (this._ReadOnly)
{
throw new NotSupportedException();
}
SettingsProperty property1 = (SettingsProperty) this._Hashtable[name];
if (property1 != null)
{
this.OnRemove(property1);
this._Hashtable.Remove(name);
this.OnRemoveComplete(property1);
}
这里的有一句代码需要关注一下:
SettingsProperty property1 = (SettingsProperty) this._Hashtable[name];
执行这一句的时候调用的是SettingsPropertyCollection(Hashtable h)这个构造函数吗?
6. SetReadOnly 方法
public void SetReadOnly()
{
if (!this._ReadOnly)
{
this._ReadOnly = true;
}
}
设置该类的实例的可读性{
if (!this._ReadOnly)
{
this._ReadOnly = true;
}
}
7. Count属性
public int Count
{
get
{
return this._Hashtable.Count;
}
}
设置该类实例的项目的条数{
get
{
return this._Hashtable.Count;
}
}
8. IsSynchronized属性
public bool IsSynchronized
{
get
{
return false;
}
}
{
get
{
return false;
}
}
设置该类是否同步,到目前为止还没有看到这个属性的用户所在。以后在研究到调用它的代码的时候,再填充这部分内容
9. this[string name]索引
public SettingsProperty this[string name]
{
get
{
return (this._Hashtable[name] as SettingsProperty);
}
}
{
get
{
return (this._Hashtable[name] as SettingsProperty);
}
}
根据键的名称得到对应的项的值。
10. SyncRoot 属性
public object SyncRoot
{
get
{
return this;
}
}
{
get
{
return this;
}
}
这个属性的作用还不清楚,以后研究到调用它的代码的时候再将这部分内容补充上
11. GetEnumerator()方法
public IEnumerator GetEnumerator()
{
return this._Hashtable.Values.GetEnumerator();
}
{
return this._Hashtable.Values.GetEnumerator();
}
获得该类实例的IEnumerator方法
12. Clone()方法
public object Clone()
{
return new SettingsPropertyCollection(this._Hashtable);
}
{
return new SettingsPropertyCollection(this._Hashtable);
}
返回该类实例的浅表副本,调用的是SettingsPropertyCollection(Hashtable h)的构造函数
13. CopyTo方法
public void CopyTo(Array array, int index)
{
this._Hashtable.Values.CopyTo(array, index);
}
{
this._Hashtable.Values.CopyTo(array, index);
}
msdn关于ICollection.CopyTo 方法的描述如下:
概述:
通过类实现时,从特定 Array 索引处开始将 ICollection 的元素复制到 Array 中。
参数:
array
作为从 ICollection 复制的元素的目标位置的一维 Array。Array 必须具有从零开始的索引。
index
array 中的从零开始的索引,从此处开始复制。
通过类实现时,从特定 Array 索引处开始将 ICollection 的元素复制到 Array 中。
参数:
array
作为从 ICollection 复制的元素的目标位置的一维 Array。Array 必须具有从零开始的索引。
index
array 中的从零开始的索引,从此处开始复制。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架