2012-01-20 12 views
4

私は主にC++のコーダーで、数年後にはC#に触れていませんでした(私の場合は脳のおならかもしれない質問をしていれば私を許してください) 。C++のプログラマーのためのC#でのポインタ代替

背景情報: 私は(ちょうど楽しみのために、そして自分のコンピュータ上の重複をクリーンアップを助けるために)ユーティリティを整理するファイルを書いています。私はファイルとファイルのMD5チェックサムを実行して、さまざまなサブディレクトリで重複したファイルを見つけることができました。同じファイル名でも時々同じファイルタイプであることもあります。私は最初に、 "MainFrom"のコードの背後にあるファイルパス文字列とWinformオブジェクト、Arraylist、Arraysをコンセプトの証明として使用してこれを行いました。コードは本当に醜いですし、私はすでにそれを見て混乱しているので、間違いなく維持することはできません。

ファイルパス、ファイル名、MD5、ファイルタイプなどの単純なものを持つオブジェクトとして、よりエレガントで賢明なデザインを保存すると思いました(はい、私はFILEについて知っています)。それで、もしそれが "重複"、 "似ている"オブジェクトの他のインスタンスへの参照を持っていれば、それは意味をなさないと思った。 私は、重複オブジェクトを指すオブジェクトの一部であるポインタの配列を作成しようとしています。そうすれば、実行時にすべての重複を調べ、プロパティなどを把握することができます。

私はこのクラスから、mp3ファイルやjpgファイルなどの特定のファイルタイプについて後で継承することを計画していました。例:どちらの画像を単にサイズ変更してお互いにポイントさせるかを特定できます)。 しかし、C#にはポインタがありません。私は代議員を見ていましたが、もう一度、それは本当に私が望むものではありません。

私のジレンマ: C#はマネージドコードにポインタを持っていません(絶対に必要な場合を除き、アンマネージドセクションは使用したくありません)。

私は、arraylistのようなものを作成し、実行時に "オブジェクト"を渡すことも考えました。しかし、それは重複を作成しないのですか?それは本当に新しいオブジェクトへの参照ではないですか?

C++からC#への移行を私がこれを超えてどのように動かすかについてのアドバイスを本当にありがとうと思います。私が完全にここで間違ったデザインに近づいている場合は、私に知らせてください。 (私はそれらが両方ともオブジェクト指向であると仮定しています。そのようなデザインは両方の世界で動作します)。

(私がC#でコーディングしようとしている最初のC++コーダーではないので)助けてくれる他のソースへの参照に本当に感謝します。前もって感謝します!

+1

する必要がありますあなたは私の一日行わ:)「のコードは本当に醜いですし、私はすでにそれを見て混乱している "私の上司が今まで言っているものです計算の問題への彼のアプローチを示す前にy時間: – Matten

+0

'class'で宣言された型は参照型です。その型の変数/ fields/...はすでに参照となります。そのような参照の多くは、すべて同じオブジェクトを参照できます。したがって、interopの外側では、ポインタは必要ありません。 – Richard

+2

本当に本が必要なようですね。私はあなたの質問が何であるか完全にはわかっていません - あなたはポインタが必要だと思いますか? –

答えて

4

C#の参照型は(ほぼ)常にポインタとして渡されます。私がする場合:

var a = new Object(); 
var list1 = new List<Object>(); 
var list2 = new List<Object>(); 
list1.Add(a); 
list2.Add(a); 

私はaを複製していません。私は両方のリストにその参照を入れています。希望が役立ちます。

+0

なぜ「(ほぼ)」ですか?彼らがいない状況は考えられません。 –

+0

参照型をbyvalに渡してもポインタを渡しますが、呼び出し側に影響を与えずにポインタ自体を変更することができます。これは.net参照に慣れていない人を混乱させる可能性があります。 –

+0

これは常に起こります。あなたの 'list1.Add(a)'は、値で参照を渡しますが、参照によってオブジェクトを渡します。 –

6

私のジレンマ: C#はマネージコード

にポインタを持っていません。しかし、それはどこにでも(アレイを含む)のオブジェクトの参照を使用しています。

var a = new StringBuilder(); 
var b = a;  // a and b now refer to the same single StringBuilder instance 
a.Append("!"); // equivalent to a->Append("!"); in C++ 

実際にはポインタが解決できると思われる機能がありません。

arraylistのようなものを作成し、実行時に "オブジェクト"を渡します。しかし、それは重複を作成しないのですか?それは本当に新しいオブジェクトへの参照ではないですか?

いいえ、ArrayListのオブジェクトにすることができますのみストアの参照、それは一般的にコピーやクローニングを必要としないようにします。それは値の型(int、double)に対してのみ起こります。しかし、より多くの機能とより少ないタイプキャストのために、List<MyClass>を必ず使用してください。

要するに、先に進む前にReference-Types、Value-Types、およびReferenceを読んでください。

2

上記のコードでは、a1とa2が互いにコピーされた2つのオブジェクトになります。 C#では、Aがクラスa1として宣言され、a2が1つの同じオブジェクトを参照するため、あなたが習得しようとしているものについてポインタ自体ではない場合

+0

ああ!これは面白いです... C++では、 "="割り当ては、私のオブジェクトが他のオブジェクトへのポインタを持っているので、私の場合はうまくいかない "浅い"コピーなので、 "深いコピー"を行う必要があります。 a2が本当にa1の「コピー」であることを確認してください。 C#はいかがですか?あなたは "浅い"と "深いコピー"を行うことができますか、またはクラスをコピーするだけで "深いコピー"を行うことはできますか? – uberspaceguru

+0

@uberspaceguru深いコピーの場合は、クローンメソッドを記述する必要があります。 –

+0

@uberspaceguru .NET/C#では、 'A'がクラスであればオブジェクトはコピーされず、参照のみがコピーされます。 'A'がクラスであれば、上記のC#コードは' A * a1と最もよく似ています。 A * a2 = a1; 'C++では。 .NET構造の場合、上記のコードはC#とC++(浅いコピー)の両方で同様の意味を持ちます。 –

0

C#のクラスのインスタンスは参照であり、ポインタ。 C#では、a = bと書くとき、abがクラスのインスタンスである場合、コピーされるのはオブジェクトへの参照だけです。同じオブジェクトへの参照が2つあります。

私はあなたの質問を読んだので、C#の参照があなたの目的に役立ちます。

0

あなたの状況では、Arraylistは問題なく動作します。 arraylistに渡されるオブジェクトは参照(ポインタに似ています)です。それらは再作成されないので、重複はありません。

0

C#はオブジェクト型の参照を渡すので、ポインタに対処する必要はありません。

そして、C#がコレクションとして提供するHashSet/generic Listsを見てください。

0

ポインタの問題を解決する別の方法はCです。 WeakReferencehttp://msdn.microsoft.com/en-us/library/ms404247.aspx

C# "shared pointer" for alternative memory management?

例:

// Create the object 
Book book = new Book("My first book", "Me"); 
// Set weak reference 
WeakReference wr = new WeakReference(book); 
// Remove any reference to the book by making it null 
book = null; 
if (wr.IsAlive) 
{ 
    Console.WriteLine("Book is alive");\ 
    Book book2 = wr.Target as Book; 
    Console.WriteLine(book2.Title); 
    book2 = null; 
} 
else 
    Console.WriteLine("Book is dead"); 

// Lets see what happens after GC 
GC.Collect(); 

// Should not be alive 
if (wr.IsAlive) 
    Console.WriteLine("Book is alive"); 
else 
    Console.WriteLine("Book is dead"); 

出力は

Book is alive 
My first book 
Book is dead 

http://www.switchonthecode.com/tutorials/csharp-tutorial-weak-references

関連する問題