private IFeature CreateEmptyGeometryFeature(IFeatureWorkspace ws,
                                                    esriGeometryType geometryType,
                                                    IGeometry andAlso = null)
        {
            ISpatialReference sr = SpatialReferenceUtils.CreateSpatialReference
                                       ((int)esriSRProjCS2Type.esriSRProjCS_CH1903Plus_LV95,
                                       true);

            IFeatureClass featureClass =
                EnsureFeatureClass(ws, geometryType, geometryType.ToString(), sr);

            IGdbTransaction transaction = new GdbTransaction();

            IFeature feature  = null;
            bool     inserted = transaction.Execute((IWorkspace)ws, () =>
            {
                if (andAlso != null)
                {
                    andAlso.SpatialReference = sr;
                    IFeature nonEmpty        = featureClass.CreateFeature();
                    nonEmpty.Shape           = andAlso;
                    nonEmpty.Store();
                }

                feature = featureClass.CreateFeature();

                // NOTE: There is no difference when setting an empty geometry
                feature.Store();
            }, "Insert feature");

            Assert.IsTrue(inserted);

            return(feature);
        }
        private static void GetFeaturesInLoop(
            int count,
            [NotNull] Func <IFeatureClass, int, IFeature> getFeatureMethod)
        {
            IFeatureWorkspace featureWorkspace =
                (IFeatureWorkspace)TestUtils.OpenSDEWorkspaceOracle();

            IFeatureClass featureClass =
                featureWorkspace.OpenFeatureClass("TOPGIS_TLM.TLM_DTM_MASSENPUNKTE");

            IList <int> oids = GetFeatureIDs(featureClass, count);

            var watch       = new Stopwatch();
            var memoryUsage = new MemoryUsageInfo();

            memoryUsage.Refresh();
            watch.Start();

            IGdbTransaction gdbTransaction = new GdbTransaction();

            gdbTransaction.Execute(
                (IWorkspace)featureWorkspace,
                delegate
            {
                foreach (int oid in oids)
                {
                    IFeature feature = getFeatureMethod(featureClass, oid);

                    ComUtils.ReleaseComObject(feature);
                }

                memoryUsage.Refresh();
                watch.Stop();

                Console.WriteLine("Features read: {0}", oids.Count);
                Console.WriteLine("Memory usage: {0}", memoryUsage);
                Console.WriteLine("Elapsed: {0:N0} ms", watch.ElapsedMilliseconds);
            }, "test");
        }