4

まず、これを物の「コピー」と呼んでいるのか分からないので、質問タイトルが間違っているかもしれません。私が持っているのは、リストの束(5〜6個のリストに1000以上の数字)とその他のプロパティを持つFileというカスタムクラスです。すべてのファイルにアクセスできるように、リストにすべてのファイルがあります(LoadedFiles)。

私の質問は: メソッドを書いていて、書きたくない場合:

DoSomeOperation(LoadedFiles[2]);

代わりに:

File file2 = new File();
file2 = LoadedFiles[2];

DoSomeOperation(file2);

これは悪い習慣ですか?または、コンパイラはそれが同じオブジェクトであることを認識し、元のリスト (LoadedFiles) から直接アクセスするほど賢いです。

4

5 に答える 5

6

実際、あなたのクラスは参照型です。つまり、行 file2 = LoadedFiles[2] は、作成されたオブジェクトへの参照ポインターのみをコピーし、オブジェクトの内容を新しいオブジェクトにコピーしていません。

したがって、パフォーマンスに関する限り、ファイルの新しいインスタンスを作成します。

 File file2 = new File();

次に、すぐに別のオブジェクトへの参照を切り替えています

file2 = LoadedFiles[2];

したがって、作成したばかりのオブジェクトへの参照を解放します。これにより、不要なガベージ コレクションが発生します。スタイルに違いがある場合は、単に File file2 = LoadedFiles[2] を実行することをお勧めします。

参照型と値型を調べるのに最適な場所は、77 ページの C# 言語仕様http://www.microsoft.com/en-us/download/details.aspx?id=7029です。

于 2013-07-17T06:47:55.727 に答える
3

File file2 = new File();
file2 = LoadedFiles[2];

コピーは重要ではありません。参照のみがコピーされています。しかし、不要なインスタンスFile()が作成されます。マージします:

File file2 = LoadedFiles[2];
于 2013-07-17T06:49:31.220 に答える
1

まず、クラス名が正しい名前空間で修飾されていることを願っていますSystem.IO.File

第二に; このステートメントfile2 = LoadedFiles[2];が正当であり、File クラスのインスタンスを返す場合、File file2 = new File();は何の役にも立ちません。

File クラスのインスタンスを DoSomeOperation に参照渡ししており、そのコピーを作成していません。

于 2013-07-17T06:57:39.590 に答える
1

これは間違いなく悪い習慣ではありません。また、オブジェクトをコピーするのではなく、参照 (4 バイトのポインター) を保持するだけです。

これは多くの場合、コーディング スタイルに関連しています。私は個人的には最初の方法が好きではありません.

va file2 = LoadedFiles[2];

私にとっては便利な選択です。

また、書いても意味がない

File file2 = new File();
file2 = LoadedFiles[2];

書くだけ:

var  file2 = LoadedFiles[2];
于 2013-07-17T06:49:25.077 に答える