2010-11-25 8 views
2

私は一般的なタイプのパラメータについて話していないことに注意してください。なぜC#とAdaの汎用パラメータには同等のものがありませんか?

たとえば、Adaでは、型の代わりに値を使用して初期化する必要があるパッケージを書くことができます。例えば

generic 
    Size : Positive; 
package Sudokus is 

    subtype Values is Positive range 1..Size*Size; 
    type Choice is private; 
    type Sudoku is private; 

    procedure Fill(S : out Sudoku); 
    procedure Init(S : out Sudoku); 
    procedure Solve(S : in out Sudoku); 
    procedure Print(S : Sudoku); 

    Unsolvable_Grid_Error : exception; 

そして、これはそれを使用する方法である:

package My_Sudoku is new Sudokus(3); -- 3 for 9x9 solver, 4 for 16x16 solver, etc. 

私は等価ではありませんと思いますが、私はそれが非常に便利。 この欠席理由はありますか?

+9

あなたは一般的にコンストラクタに渡すことができますか? – Rup

+3

コンストラクタ呼び出しで簡単に解決できない例を提供できますか? –

+0

ベクトル構造体。しかし、それはたぶん2から4までの各次元に対して一度良い方が良いでしょう。 – CodesInChaos

答えて

3

"なぜC#には機能Xがないのですか"という一般的な答えは、このような機能の利点とコストの関係を中心に展開されています。利点は、通常は明白ですが、コストが含まれます:言語仕様

    • 増加複雑さがいっぱい
    • の向上、教育の要件に言語を使用してコードの複雑さを向上 - 開発者が自分を理解するために、より多くを知っている必要があります同僚のコード
    • 機能を設計する
    • コスト
    • 機能を実装するの
    • コスト
    • 機能のテストの
    • コスト
    • は、後に多くの機能を追加することに難しさを向上 - 多くの場合、相互に作用しますますので、多くの場合、厄介な方法で

    基本的には、特定の機能が存在しない理由を尋ねるの場合はすべきではない:それをこの機能の利点はコストと比較して莫大だと主張するべきである。機能は言語でその場所を獲得しなければならず、言語設計者はバーをかなり高く設定しています。 Andersが過去に行ったように、すべての機能は-100のスコアで始まり、その方法を働かなければなりません。

  • 1

    なぜなら、単にサイズをコンストラクタに渡して配列を初期化しないのはなぜですかそれと?

    class Sudokus 
    { 
        char[] field; 
        public Sudokus (int size){ field = new char[size*size]; } 
    } 
    

    あなたはより高速なアクセスを可能とすることができ、固定サイズの配列を、持っていた場合、私は、「一般的なパラメータ」で見ることができる唯一の利点があるが、それは非として、少なくともではない(とにかくC#でサポートされていません。 -local変数)。

    私はこの種のテンプレートがC++でサポートされていることを知っています。テンプレートはC#またはJavaのテンプレートよりはるかに優れています。

    +3

    C#ジェネリックスは、最初はテンプレート化されていないので、そのように見なされるべきではありません。優位性はコンテキストに依存します - 状況によってはC++テンプレートがより便利で、通常はより強力です。他の状況では、C#のジェネリックも同様に便利で分かりやすくなります。場合によっては、C#ジェネリックスは、タイプ引数が実行時にしかわからないときにジェネリック型を作成するなど、C++テンプレートでは使用できないことを認識している能力を提供します。ジェネリックがバイナリ形式で提供される可能性もまた潜在的に便利です。 –

    +0

    @ジョン:あなたは正しいです。 C++の*テンプレート型をインスタンス化することは可能ですが、C#の 'new'制約にほぼ相当します。これはコンパイル時に解決され、C#の' new T( ) 'が解決する。 –

    +0

    @ Konrad:私は、リフレクションを使って 'List 'を作成するのと同じ意味で、 'T'は実行時にしか知られていませんでした。 ( 'Type.MakeGenericType'を使用します。) –

    関連する問題