4

首先,我不知道这是否称为“复制”一个对象,所以问题标题可能是错误的。我拥有的是一个名为 File 的自定义类,其中包含一堆列表(5-6 个列表中的 1000 多个数字)和一些其他属性。我将所有文件都放在一个列表中,以便能够访问它们(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] 。

查看引用类型与值类型的最佳位置是 C# 语言规范http://www.microsoft.com/en-us/download/details.aspx?id=7029(第 77 页)。

于 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

这绝对不是习惯。而且你不复制一个对象,你只是在它上面保留一个引用(4字节的指针)。

这通常与编码风格有关。我个人不喜欢第一种方式,因为它使阅读变得复杂,而且我经常需要检查函数的返回值,所以有

va file2 = LoadedFiles[2];

对我来说只是方便的选择。

也没有写的意思

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

写吧:

var  file2 = LoadedFiles[2];
于 2013-07-17T06:49:25.077 回答
1

首先 - 我希望您使用正确的命名空间来限定您的类名,因为我预见到与System.IO.File.

第二; 如果这个语句file2 = LoadedFiles[2];是合法的并且返回你的 File 类的一个实例,那么File file2 = new File();它就没有用了。

您通过引用将 File 类的实例传递给 DoSomeOperation,而不是复制它。

于 2013-07-17T06:57:39.590 回答
0

让我们从您的代码开始:

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

第一行是多余的。您分配一个新文件,只是说“嘿,看,忘记那个,从数组中取出一个”。好吧,那么不要创建新文件:

File file2 = LoadedFiles[2];

现在,看起来您可能已经复制了 LoadFiles[2] 中的任何内容。但你没有。您复制的只是reference该对象的一个​​。仍然只有一个对象,现在有两个变量知道它。

作为比较:您的朋友住在橡树街 123 号。您的地址簿中有该地址。那是一个参考。你在那里没有他真正的房子,只是参考他的房子,这样你就可以找到它。当您通过将其发送到另一个朋友的电话簿来复制该引用时,该引用被复制了。原来的房子仍然只是一栋房子。通过复制地址,没有建造第二所房子。

于 2013-07-17T06:52:17.290 回答