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