c# – 代码正在修改错误的变量……为什么?
我有一个奇怪的事情,我正在做的一些代码是修改副本和原始列表..我已尽可能地解决问题,只能在单个文件中显示错误.虽然我的现实世界的例子我们要复杂得多……但是根本就是这个问题.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TestingRandomShit { class Program { private static string rawInput; private static List<string> rawList; private static List<string> modifiedList; static void Main(string[] args) { rawInput = "this is a listing of cats"; rawList = new List<string>(); rawList.Add("this"); rawList.Add("is"); rawList.Add("a"); rawList.Add("listing"); rawList.Add("of"); rawList.Add("cats"); PrintAll(); modifiedList = ModIt(rawList); Console.WriteLine("nn**** Mod List Code has been run **** nn"); PrintAll(); } public static List<string> ModIt(List<string> wordlist) { List<string> huh = new List<string>(); huh = wordlist; for (int i = 0; i < huh.Count; i++) { huh[i] = "wtf?"; } return huh; } //**************************************************************************************************************** //Below is just a print function.. all the action is above this line public static void PrintAll() { Console.WriteLine(": Raw Input :"); Console.WriteLine(rawInput); if (rawList != null) { Console.WriteLine("n: Original List :"); foreach (string line in rawList) { Console.WriteLine(line); } } if (modifiedList != null) { Console.WriteLine("n: Modified List :"); foreach (string wtf in modifiedList) { Console.WriteLine(wtf); } Console.ReadKey(); } } } } 基本上,我有三个变量……一个字符串和两个List.原始代码对字符串进行了一些标记化处理,但对于本演示,我简单地使用List.Add()来伪造它以使其易于阅读. 所以我现在有一个字符串和一个List,每个元素中都有一个单词. 这是我不理解的令人困惑的部分..我知道它与引用有关但我无法弄清楚如何适应它. 有一个我称之为ModIt()的方法…它简单地接受一个List然后创建一个名为huh的全新List,将原始列表复制到新列表中,然后将huh中的每一行更改为“wtf?”. 现在据我所知..我应该最终得到3个变量…… 1)一个字符串 但是,会发生什么呢?我试图打印出两个列表,他们将每个元素都设置为“WTF?”….所以是啊.. wtf man?我非常困惑.我的意思是在ModIt中我甚至构建了一个完整的新字符串,而不是修改一个正在通过的字符串,但它似乎没有任何效果. 这是输出……
解决方法
huh = wordlist;不将wordlist的项目复制到新列表中,它将引用复制到wordlist占用的同一对象(即huh和wordlist然后指向内存中的同一对象).
如果你想要一个副本,最简单的方法就是使用LINQ: List<string> huh = wordlist.ToList(); 请注意,这将是一个“浅拷贝”.如果列表存储引用对象,则旧列表和新列表都将存储对相同对象的引用. 有关值与引用类型的更多读数,请参阅here;如果需要深层复制,请参阅here. 既然你所做的只是替换列表索引处的值,我想一个浅的副本就可以了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |