FeatureClass.Search(IQuery Filter,bool Recycling)參數說明
2011-07-19 8:32
IFeatureClass的Search方法大家經常用到,很多人對Search方法的其中一個參數bool Recycling不是很理解。目前網上關于這個參數的意義的解釋有兩個版本:1.第一版本是Isnotnull大牛的:http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=13461他提出的觀點的是:參數Recycling為True的時候是傳引用,為False的時候為傳值2.第二個版本是Echo兄的:http://gis.cnblogs.com/home.aspx?page=3他提出的觀點是:參數Recycling為True的時候游標對象(Ifeaturecursor)是只包含一條記錄,為False的時候游標對象(Ifeaturecursor)為10條記錄(假設Featureclass有10條記錄)我經過測試提出個人的觀點:1.pFeatureCursor存儲的是所有符合條件的Feature對象的引用,2.Recycling的意思是回收,參數Recycling為True的時當執行這個方法IFeature pFeature=pFeatureCursor.NextFeature()上一條記錄的值在內存中所占的地址就會被銷毀回收,為False的時候當執行這個方法IFeature pFeature=pFeatureCursor.NextFeature()上一條記錄的值依然存在在內存中。Ok,接下來以實例證明本觀點:1.參數Recycling設置為True IFeatureClass pFeatureClass = (this.axMapControl1.get_Layer(0) as IFeatureLayer).FeatureClass; IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, true); //IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false); List<IFeature> pFeatures = new List<IFeature>(); IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { pFeatures.Add(pFeature); pFeature = pFeatureCursor.NextFeature(); } for (int i = 0; i < pFeatures.Count; i++) { MessageBox.Show(((pFeatures.Shape as IPolygon) as IArea).Area.ToString()); }分析:pFeatures集合存儲了指向FeatureClass上所有Feature的引用,但是由于Recycling參數設置為TRUE也就是說沒執行一個NextFeautre方法上一條記錄的Feature值在內存中被回收,所以到最后遍歷pFeatures集合的時候所有的IFeature引用指向的Feature對象都為Null。所以會引發一下錯誤(如下圖所示):
2.參數Recycling設置為False IFeatureClass pFeatureClass = (this.axMapControl1.get_Layer(0) as IFeatureLayer).FeatureClass; //IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, true); IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false); List<IFeature> pFeatures = new List<IFeature>(); IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { pFeatures.Add(pFeature); pFeature = pFeatureCursor.NextFeature(); } for (int i = 0; i < pFeatures.Count; i++) { MessageBox.Show(((pFeatures.Shape as IPolygon) as IArea).Area.ToString()); }分析:pFeatures集合存儲了指向FeatureClass上所有Feature的引用,但是由于Recycling參數設置為False也就是說每執行一個NextFeautre方法上一條記錄的Feature值在內存中依然存在,所以到最后遍歷pFeatures集合的時候所有的 IFeature引用指向的Feature對象都依然存在。所以會執行的很Happy(如下圖所示):
|