2016-05-28 6 views
0

私はちょうどC#を学び始めました。本当にリストのコンセプトが好きです。私はなぜポインタのリストを作ることができないのだろうかと思っています。私は私のクラスのオブジェクトへのポインタのリストを作成しようとしているが、私は書くとき:ポインタのリスト(ポインタ型)?

List <MyClass*> mylist; 

かさえ:

The type 'MyClass*" may not be used as a type argument 

List <int*> mylist; 

VSはエラーメッセージを表示しますなぜ私は考えていない。これに対する解決策はありますか、またはポインタ型のリストを作ることを完全に禁じられていますか?

(申し訳ありませんばかな質問のために、私はちょうど学んだもの)は、クラスのインスタンスのリストを作成するC#ので

+1

c#はポインタではありません...ポインタでは扱えないので、valやref(ポインタのようなもの)で変数を操作することができます – Proxytype

+1

@Proxytypeあなたはちょうど*すべきではありません。また、参照で値を渡すことは、C++のポインタと似ていません。C++での参照渡しのようなものです。どちらの言語も全く同じ機能を持ち、同じセマンティクスを持っています(ただし構文は少し異なります)。 – Servy

+0

私はそのようなことをすることができ、なぜ好きではないのだろうか(好奇心から、より多くを学ぶために)疑問に思っていました。両方とも説明をいただきありがとうございます。 –

答えて

1

は、その後、方法が簡単です。ストアするクラスまたは値を使用してリストを初期化し、インスタンスまたは値を追加します。

List<MyClass> myList = new List<MyClass>(); 

MyClass myClass1 = new MyClass; 
myList.Add(myClass1); 

またはINT用:

例えばMyClassインスタンスのリストは、このようなものになるだろう

List<int> myList = new List<int>(); 
myList.Add(123);  

そして、それはそれです。クラスのインスタンスを格納するポインタは必要ありません。

編集

参照型または参照が含まれている構造体の型へのポインタを持っているC#でない可能性がありません。それは、ガベージコレクタがポインタを指していても参照型を集めることができるためです。このトピックについては、MSDN Pointer typesの記事で詳しく説明しています。したがって、C#ではMyClass*のようなものは許可されません。

また、同じ記事では、sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、またはboolしか使用できないことがわかります。 List<int*>the documentationに質問に関しては

についてint*型引数としては、ポインタ型は、型引数として使用することはできませんと言います。詳細は第18.4.1章を参照してください。 int*あるいはMyStruct*MyStructがインスタンスフィールド(再帰的に)再度、値型である通常のレイアウトと値型でなければならない場合)のような

+0

はい、私はそれを行う方法を知っています。私は、そのような可能性があるのか​​、なぜそうでないのか(好奇心から、より多くを学ぶこと)が不思議に思っていました。ありがとうございました。 :) –

1

ポインタ型は、C#には存在しないが、ほとんどのアプリケーションでは非常に頻繁に使用されていません。

ただし、ポインタ型を汎用型引数として使用することはできません。の "T"はint*にはできません。たとえば、int*[]またはMyStruct*[]のようなポインタの配列を持つことは問題ありません。

質問に答えるには:いいえ、ジェネリック型の引数にポインタ型を使用する方法はありません。これは単なるC#の制限ではなく、CLRタイプのシステムはそれを拒否していることに注意してください(例えば、typeof(List<>).MakeGenericType(typeof(int*))は例外をスローします)。

これに関連して、ポインタ型はC#/ .NET型のシステムで "普通の"具象型のようにobjectから継承しません。

C#では、ポインタは値型にのみ適用されます。参照型(classで宣言されたユーザー定義型)の場合、その型の変数または式の「値」は、実際のインスタンスに対する参照(実装定義のメモリ位置)またはヌル参照(インスタンスは参照しません)。これらの参照は、 "ポインタ"と多少似ていますが、int*MyStruct*のような真のポインタのように算術演算(メモリ位置の加算や減算、または "アドレス"の整数への変換など)はできません。

関連する問題