瀏覽代碼

Avoiding duplicate enumeration of collection

bartdesmet 10 年之前
父節點
當前提交
3e1fe0448d
共有 1 個文件被更改,包括 8 次插入9 次删除
  1. 8 9
      Rx.NET/Source/System.Reactive.Core/Reactive/Disposables/CompositeDisposable.cs

+ 8 - 9
Rx.NET/Source/System.Reactive.Core/Reactive/Disposables/CompositeDisposable.cs

@@ -46,14 +46,8 @@ namespace System.Reactive.Disposables
         /// <exception cref="ArgumentNullException"><paramref name="disposables"/> is null.</exception>
         /// <exception cref="ArgumentNullException"><paramref name="disposables"/> is null.</exception>
         /// <exception cref="ArgumentException">Any of the disposables in the <paramref name="disposables"/> collection is null.</exception>
         /// <exception cref="ArgumentException">Any of the disposables in the <paramref name="disposables"/> collection is null.</exception>
         public CompositeDisposable(params IDisposable[] disposables)
         public CompositeDisposable(params IDisposable[] disposables)
+            : this((IEnumerable<IDisposable>)disposables)
         {
         {
-            if (disposables == null)
-                throw new ArgumentNullException("disposables");
-            if (disposables.Any(d => d == null))
-                throw new ArgumentException("Disposables collection can not contain null values.", "disposables");
-
-            _disposables = new List<IDisposable>(disposables);
-            _count = _disposables.Count;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -66,10 +60,15 @@ namespace System.Reactive.Disposables
         {
         {
             if (disposables == null)
             if (disposables == null)
                 throw new ArgumentNullException("disposables");
                 throw new ArgumentNullException("disposables");
-            if (disposables.Any(d => d == null))
-                throw new ArgumentException("Disposables collection can not contain null values.", "disposables");
 
 
             _disposables = new List<IDisposable>(disposables);
             _disposables = new List<IDisposable>(disposables);
+            
+            //
+            // Doing this on the list to avoid duplicate enumeration of disposables.
+            //
+            if (_disposables.Contains(null))
+                throw new ArgumentException("Disposables collection can not contain null values.", "disposables");
+            
             _count = _disposables.Count;
             _count = _disposables.Count;
         }
         }