Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复制对象会降低性能吗?_C# - Fatal编程技术网

C# 复制对象会降低性能吗?

C# 复制对象会降低性能吗?,c#,C#,首先,我不知道这是否被称为“复制”对象,所以问题的标题可能是错误的。我有一个名为File的自定义类,它包含一组列表(5-6个列表中有1000多个数字)和一些其他属性。我的所有文件都在一个列表中,以便能够访问它们(LoadedFiles) 我的问题是:如果我正在写一个方法,而我不想写: DoSomeOperation(LoadedFiles[2]); 但是: File file2 = new File(); file2 = LoadedFiles[2]; DoSomeOperation(fil

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

我的问题是:如果我正在写一个方法,而我不想写:

DoSomeOperation(LoadedFiles[2]);
但是:

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

DoSomeOperation(file2);

这种做法不好吗?或者编译器足够聪明,知道它是同一个对象,并直接从原始列表(LoadedFiles)访问它。

实际上,您的类是一个引用类型,这意味着行file2=LoadedFiles[2]将只复制一个指向所创建对象的引用指针,您没有将对象的内容复制到新对象中

就性能而言,您需要创建文件的新实例:

 File file2 = new File();
然后立即将引用切换到另一个对象

file2 = LoadedFiles[2];
从而释放对刚刚创建的对象的引用。这将导致不必要的垃圾收集。如果对您的风格有影响,最好只做File file2=LoadedFiles[2]

研究引用类型与值类型的最佳地方是第77页的C语言规范。

这肯定不是一个坏做法。 你不复制一个对象,你只需要在它上面保留一个引用(4字节的指针)

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

va file2 = LoadedFiles[2];
这对我来说是个方便的选择

也没有写作的意义

File file2 = new File();
file2 = LoadedFiles[2];
只要写下:

var  file2 = LoadedFiles[2];

复制并不重要。仅复制引用。但是创建了一个不必要的
File()
实例。合并它:

File file2 = LoadedFiles[2];

让我们从您的代码开始:

File file2 = new File();
file2 = LoadedFiles[2];
第一行是多余的。分配一个新文件,只是为了说“嘿,看,忘了那个,从数组中取一个。”那么,不要创建新文件:

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


作为比较:你的朋友住在橡树街123号。你的通讯录上有这个地址。那是一份推荐信。你那里没有他真正的房子,只是他房子的参考资料,你可以找到它。当您通过将该引用发送到另一个朋友的电话簿来复制该引用时,该引用已被复制。原来的房子仍然只是一栋房子。通过抄写地址,没有建造第二栋房子

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

第二; 如果此语句
file2=LoadedFiles[2]
是合法的,并返回File类的实例,然后
File file2=new File()没有任何作用


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

File file2=new File()是一种无意义的分配,因为您正在设置
file2
首先需要了解值类型和引用类型之间的差异。
File file2 = LoadedFiles[2];