随笔 - 547  文章 - 213 评论 - 417 阅读 - 107万

Microsoft.ScalableHosting.Profile.SettingsPropertyCollection的源代码


下面是类图:



 

这个类继承了三个接口,分述如下:
1.    IClonable接口
msdn对这个接口的描述如下:
----------------------------------------------------------------------------------

概述:
     支持克隆,即用与现有实例相同的值创建类的新实例。
     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 接口派生新集合类以提高灵活性。




3. IEnumerable接口
   msdn的描述如下:
    概述:公开枚举数,该枚举数支持在集合上进行简单迭代。
    备注:对实施者的说明:  
              必须实现 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);
        }

 

        private SettingsPropertyCollection(Hashtable h)
        {
            
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 实现。 

 

备注
如果指定初始容量,则无需在向 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);
        }

如果只读,就抛出错误。
否则,先执行OnAdd方法,进行添加前的处理,然后添加到HashTable中,然后执行OnAddComplete方法,进行添加后的处理


4. Clear方法

        public void Clear()
        {
            
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);
            }
        

这里的有一句代码需要关注一下:

  SettingsProperty property1 = (SettingsProperty) this._Hashtable[name];

执行这一句的时候调用的是SettingsPropertyCollection(Hashtable h)这个构造函数吗?

6. SetReadOnly 方法

        public void SetReadOnly()
        {
            
if (!this._ReadOnly)
            {
                
this._ReadOnly = true;
            }
        }
设置该类的实例的可读性


7. Count属性

        public int Count
        {
            
get
            {
                
return this._Hashtable.Count;
            }
        }
设置该类实例的项目的条数


8. IsSynchronized属性

        public bool IsSynchronized
        {
            
get
            {
                
return false;
            }
        }

设置该类是否同步,到目前为止还没有看到这个属性的用户所在。以后在研究到调用它的代码的时候,再填充这部分内容


9. this[string name]索引

        public SettingsProperty this[string name]
        {
            
get
            {
                
return (this._Hashtable[name] as SettingsProperty);
            }
        }

根据键的名称得到对应的项的值。

10. SyncRoot 属性

        public object SyncRoot
        {
            
get
            {
                
return this;
            }
        }

这个属性的作用还不清楚,以后研究到调用它的代码的时候再将这部分内容补充上


11. GetEnumerator()方法

        public IEnumerator GetEnumerator()
        {
            
return this._Hashtable.Values.GetEnumerator();
        }

获得该类实例的IEnumerator方法



12. Clone()方法

        public object Clone()
        {
            
return new SettingsPropertyCollection(this._Hashtable);
        }

返回该类实例的浅表副本,调用的是SettingsPropertyCollection(Hashtable h)的构造函数


13. CopyTo方法

        public void CopyTo(Array array, int index)
        {
            
this._Hashtable.Values.CopyTo(array, index);
        }

msdn关于ICollection.CopyTo 方法的描述如下:

概述:
通过类实现时,从特定 Array 索引处开始将 ICollection 的元素复制到 Array 中。

参数:
array 
作为从 ICollection 复制的元素的目标位置的一维 Array。Array 必须具有从零开始的索引。 
index 
array 中的从零开始的索引,从此处开始复制。 


posted on   今夜太冷  阅读(413)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示