2011-12-21 7 views
4

私はC++のバックグラウンドから来て、自分自身を教えようとしています。私はまだ学生ですが、これは学校プロジェクトではなく、今は休憩中です。私の主な焦点はC/C++、javaコレクションはC#

私は2年前の私はC++でコンテナにDVD、本、DVD、情報を格納し、それを表示した古い学校のプロジェクトを持っています。私はC#で同じプログラムを作成しようとしています

私は2つの非常に似ている質問..私のプログラムで

そうのようなコンテナのコンテナにtypedefを使用して作られたオブジェクトがあります。

typedef set<Item*> ItemSet; 

ItemSet allBooks;   // holds all the information 
ItemSet allCDS; 
ItemSet allDVDs; 

最初の質問は、Cで#typdefはないと思います。しかし、私はコンテナでそれを使用することはできません。上記のC#で同様のことを行う方法はありますか?それとも、複数のセットを作成するだけですか? 私はHashSetのは、C++

HashSet<Item> keys = new HashSet<Item>(); 

2番目の質問、私はまた、クラスの外セットにtypedefを使用して、プライベートセクション に私が作ったとセットのオブジェクトさを中に設定して類似していることを決めました。 C#でこれを行うことはできますか?

typedef set<string> StringSet; 

class Item 
{ 

private: 

string Title; 
StringSet* Keys;  // holds keywords 

C#にはポインタがありません。

+4

いずれかの "C#が何のポインタを持っていない" またはのあなたのポイントに応じて、 "ほとんどすべては、C#でポインタです"ビュー。 –

+0

"安全ではないコードでC#にポインタがありません"と認識しています。 http://msdn.microsoft.com/en-us/library/chfa2zb8%28v=vs.71%29.aspx –

答えて

3

C#にはtypedefのようなものはありません。タイプ名は直接使用するだけです。

HashSet<Item> allBooks = new HashSet<Item>(); 
HashSet<Item> allCDs= new HashSet<Item>(); 
HashSet<Item> allDVDs = new HashSet<Item>(); 
HashSet<string> keys = new HashSet<string>(); 

そう...

class Item 
{ 
    private string title; 
    private HashSet<string> keys = new HashSet<string>();  // holds keywords 

using文は、コンパイラが型の名前を解決するために検索する名前空間を宣言します。上記のために働くようにするには、ソースファイルの先頭に

using System.Collections.Generic; 

を必要としています。 using声明なし

あなたはC++のtypedef C#で平行概念がない

System.Collections.Generic.HashSet<Item> allBooks = new System.Collections.Generic.HashSet<Item>(); 
2

しなければならないと思います。あなたの人生を容易にし、あなたにいくつかの入力を保存するには、C#が使用すると、ローカル変数の宣言/初期化タイプをスキップすることができます:

var keys = new HashSet<Item>(); 

は、あなたはまだフルを使用する必要が

HashSet<Item> keys = new HashSet<Item>(); 

と同じですメンバー宣言を入力します。しかし、それはインターフェースとしてではなく、正確な型としてメンバを宣言することをお勧めし:

class MyClass { 
    ISet<Item> allBooks = new HashSet<Item>(); 
} 

これは、あなたのコード内で何かを変更することなく、後で実装を切り替えてみましょうことができます。

+0

'ItemSet = System.Collections.Generic.HashSet ;を使用して、' typedefに似た何かを達成することができますC++。 – Marlon

+0

@マールロン私は、この類似点はC++の後でC#を試してみる人に多大な助けとなるには早すぎると思います。 'using'宣言は、コンパイル単位内の型に対してのみ働くローカルの' #define'のようなもので、名前空間の本体の終わりを越えて延びておらず、リフレクションでは見えません。私はそれが答えより多くの質問をもたらすだろうと思う。 – dasblinkenlight

1

C#は明示的にtypedefを持っていませんが、type aliasを作成するのに最も近いのはusing宣言です。「私に避難所をusing directiveとのtypedefと同等であり

var set = new StringSet(); 
+1

追加情報として、C++ではヘッダ内の 'typedef'を実行し、' StringSet'を使用したいところにヘッダを '#include 'するだけでは、C#ではすべてのファイルで型名を指定する必要がありますあなたは 'StringSet'エイリアスを使いたいと思っていました。 –

1

、しかし:その後、後であなたのような何かができる上

using StringSet = System.Collections.Generic.HashSet<string>; 

:あなたのC#ファイルの上部には、あなたのような何かを行うことができますそれは一般的に使用されて見た。フルタイプが通常使用されます。必要がある場合(たとえば、アイテムのコレクションの横に他のデータを格納する必要がある場合)、public class ItemSet : List<Item>のようなクラスを作成します。オブジェクトの値は、(デフォルトでは、それらは本質的にインスタンスを識別しないセットは、同じアイテムを2回以上含まれていなければならない場合

HashSet<T>を使用する必要があり、そしてObject.EqualsObject.GetHashCode方法は、データタイプの意味のあります)。オブジェクトがセットにまだ存在していない場合は、これらのオブジェクトを自動的に追加します。もっと一般的なアプローチは、アイテムを格納するためにList<T>を使用することです。私があなたの状況を少し知っているから、List<T>がうまくいくはずです。

class Item 
{ 
    private string Title; 
    List<string> Keys;  // holds keywords 
} 

そして:

だから私のようなものをお勧めします

List<Item> allBooks = new List<Item>(); 
List<Item> allCDs= new List<Item>(); 
List<Item> allDVDs = new List<Item>(); 
関連する問題