3

Since many years, we use generic collections most of the time. Sometimes we really do need a collection of anything (well, usually only a few different things but with no common base class). For such circumstances we can use either IList or the generic IList<object> as type for method arguments and properties.

Is there any reason to prefer one over the other? Performance characteristics?

Personally, I'm leaning towards IList<object>, as I think this makes it more clear that we really do accept "anything". When a parameter is typed as IList we cannot immediately tell if this method do accept anything, or if the lack of generics is due to history or sloppy coding.


Make illegalMoveFlag a paramter in the function instead of a global variable

I'll give you a simple example with factorials

ie: 0! = 1 n! = n * (n - 1)! when n (1 ... infinity)

lets call this a recursive factorial

(define (fact-r n)
    (if 
       [eq? n 0] 
       1 
       (* n (fact-r (- n 1)))
    )
)

An alternative would be to use a parameter to the function to end the recursion Lets call it iterative factorial

(define (fact-i n total)
  (if 
      (eq? n 0) 
      total
      (fact-i (- n 1) (* n total))
  )
)

total needs to start at 1 so we should make another function to make using it nicer

(define (nice-fact n)
  (fact-i n 1))

You could do something similar with illegalMoveFlag to avoid having a global variable As far as avoiding using set! goes, we'll probably need more information.

In some cases its still rather hard to avoid using it. Scheme is fully turing complete without the use of set! however when it comes to accessing an external source of information such as a database or a robot set! can become the only practical solution...

4

1 に答える 1

5

正当な理由があります: LINQ とその拡張メソッドです。これらは、ジェネリック以前の時代の型には実装されていません。LINQ を利用するには、を呼び出す必要があります。Cast<T>IList

もう 1 つのポイントは、最新の .NET バージョンは共分散と反分散をサポートし、ほとんどのジェネリック インターフェイスはどちらか一方をサポートするため (feIEnumerable<out T>T共変)、インターフェイスのジェネリック パラメーターをオブジェクトまたはあまり特定されていないものとの間で簡単にダウンキャストまたはアップキャストできることです。タイプ。

結論: なぜジェネリックが好まれるのか?

  • ジェネリック型は多くのキャストを回避するため、パフォーマンスが向上します。
  • 新しい API は、ジェネリック コレクションとインターフェイスに依存しています。
  • 同じリストに異なるタイプのオブジェクトを混在させることは危険であり、コーディング/設計上の決定を下す可能性があると考える理由はたくさんあります。また、あらゆる種類のオブジェクトを格納する数少ないケースでは、LINQ や他の多くの新しい API や機能を友人として使用することは、車輪を再発明せずに多くの時間を節約するための強力な理由になります!
于 2013-02-24T11:17:03.940 に答える