有关AE中Search(filter,Recycling)方法Recycling参数剖析
□文/Echo
前言:由于最近工作较忙,好长一段时间没来GIS相关团队看望大家的大作了。前几天看到GIS雲中飛鹏兄弟转载的一篇文章——《Engine中IFeatureClass.Search(filter, Recycling)方法中Recycling-转载》(下文简称<云>文),觉得文中作者对Recycling参数的理解还存在着许多问题,同时估计有相当多的朋友可能对Recycling参数的理解也不甚具体,因此特写了这篇文章来与大家一起讨论和学习。如果对文中观点持不同意见,还请不吝请教!
一、怎样来理解Recycling参数的含义?
学习ArcGIS最好的资料在我认为就是它的原版E文了,虽然理解起来可能会令人有些费解。我们不妨来看看ArcGIS开发帮助文档中有关ISelectionSet. Search (IQueryFilter pQueryFilter, bool Recycling, ref ICursor ppCursor)方法中Recycling参数的具体描述,这一段描述也适合于其它相关Search方法中Recycling参数:
The Recycling parameter controls row object allocation behavior.
Recycling cursors rehydrate a single feature/row object on each fetch and can be used to optimize read-only access, for example, when drawing. It is illegal to maintain a reference on a feature/row object returned by a recycling cursor across multiple calls to NextRow on the cursor. Feature/Row objects returned by a recycling cursor should not be modified.
Non-recycling cursors return a separate object on each fetch。The features/rows returned by a non-recycling cursor may be modified and stored with polymorphic behavior. The geodatabase guarantees "unique instance semantics" on non-recycling feature/row objects fetched during an edit session. If the object to be retrieved by a call to search has already been instantiated and is being referenced by the calling application, then a reference to the existing row object is returned.
针对上面这段E文,我们来分析一下它到底要表达什么意思。
首先我查阅了Recycling这个单词,它的意思为:[ 回收;(资源,垃圾)回收利用 ];
再看这句话The Recycling parameter controls row object allocation behavior,其意思为:Recycling参数控制行对象的具体分配。
E文的第二段说明了当Recycling参数为true时,要素或行对象分配的情况。其大概意思如此:
Recycling cursors它有助于提高获取下一要素或行对象的访问速度(性能上会有所优化),适用于Drawing操作,且在每次获取下一要素或行对象时都会被初始化(指的是Recycling cursors),如果想通过它来获取每一遍历要素或行对象的引用指针是一种非法的操作。通过它获取的要素或行对象不能对其进行修改操作(只读的)。
E文的第三段说明了当Recycling参数为false时,要素或行对象分配的情况。其大概意思如此:
Non_ Recycling cursors获取下一要素或行对象时都会返回一个独立的引用对象,可以对其进行修改和更新操作。GeoDataBase有一种机制可以保证它在编辑会话中的唯一性,即如果该要素或行对象已经被应用程序调用,那么你通过Non_ Recycling cursors返回的要素或行对象将是那个已经存在的对象。
二、怎样来理解Recycling Cursors与Non_Recycling Cursors?
相信大家看了上面两段文字,对Recycling参数的已有了一个大致的理解,但是对其实际内核的东西(究竟是怎么分配)可能不解了。这里我作一个简单的分析:
//Recycling Cursors
IFeatureCursor tFeatureCursor1 = pFeatureClass.Search(null,true);
//Non_Recycling Cursors
IFeatureCursor tFeatureCursor2 = pFeatureClass.Search(null,false);
1、tFeatureCursor1与tFeatureCursor2都是引用对象;
2、tFeatureCursor1(游标对象)里面只包含一条记录,而tFeatureCursor2则包含pFeatureClass中的所有记录。假设pFeatureClass有10条记录,那么通过Search方法,tFeatureCursor1只包含第1条记录,tFeatureCursor2则包含10条记录。
3、获取下一对象时,tFeatureCursor1.NextFeature();执行完后,tFeatureCursor1其本身已经发生变化,还是只包含一条记录,这次变成包含前一记录的下一个记录了。比如开始其是包含第1条记录的对象,那么通过NextFeature()方法,则变成是包含第2条记录的对象了,同时其返回第二条记录。(注意这个时候tFeatureCursor1引用地址已经发生了变化).而tFeatureCursor2.NextFeature()执行后,其引用地址不发生变化,返回的是前一记录的下一记录。
4、下面是一小段示例性的代码,执行完后,大家想一下tListFeatures中每一个对象是否会是同一个对象呢?答案是肯定的。为什么是这种情况呢?问题的关键就在于tFeatureCursor1的引用地址老是在不停的变化,而它发生变化则相应的tFeature1也会跟着发生变化,别忘了tFeature1也是引用对象,而且其关系与tFeatureCursor1是非常紧密的。每执行一次NextFeatur()方法,前一tFeature1的引用地址都变成了当前记录的地址。
IFeature tFeature1=tFeatureCursor1.NextFeature();
IList<IFeature> tListFeatures=new List<IFeature>();
While(tFeature1 !=null)
{
tListFeatures.Add(tFeature1)
tFeature1=tFeatureCursor1.NextFeature();
}
三、《云》文中的误解:
《云》文将其理解为“传值”与“传址”的问题,这与实际情况不符。同时其认为:我们知道引用传递(“传址”)效率较高。更是误导初学者,“传址”传递难道真的比“传值”效率高吗?建议作者还有待加强编程方面基础知识的学习。接着作者举了两个例子,说了一通,来证明其理解的正确性,这里我就不详细分析了。
严重声明:转载请注明出处,请大家相互尊重。